2013-07-13 44 views
0

我使用glade作为我的GUI并创建一个进程来运行我的GUI。此应用程序将打开一个套接字,当'点击'被点击。当我按'发送'时,它会将任何文本字段发送到套接字。套接字接收这些数据并将其发回。问题是我发送数据到套接字线程不终止后。另外,我关闭我的GUI后,它调用一个sys.exit(),但也离开了一个进程,并没有终止。我相信错误在于我如何实施我的流程或一般的所有处理。任何人都可以对此发光一些?这也与我最后的帖子有关。由于Python终止多处理和优雅的过程

main.py

,创造一个新的进程对我的图形用户界面和显示//主线程它

import socket, thread, gtk, Handler, sys, os, multiprocessing 
sys.setrecursionlimit(10000) 


if __name__ == '__main__': 

    builder = gtk.Builder() 
    #32bit template.glade 64bit template-2.22 
    # @todo add switching between architectures 
    # 
    builder.add_from_file("template/template-2.22.glade") 
    builder.connect_signals(Handler.Handler(builder)) 
    window = builder.get_object("window1") 
    window.show_all() 
    try: 
     p = multiprocessing.Process(target=gtk.main()) 
     p.start() 

    except: 
      print "Error Starting new Thread" 

handler.py

//处理程序为GTK空地信号,产生新线程和手柄按钮和东西

import thread, threading, os, server, client,multiprocessing, time 
import sys, gtk 


class Handler(object): 
    ''' 
    classdocs 
    ''' 
    myobject = '' 

    def __init__(self,object1): 
     #Getting glade builder 
     self.myobject = object1 
     ''' 
     Constructor 
     ''' 

    def clickme(self,value): 

     myserver = server.Server() 
     try: 
      p = multiprocessing.Process(target=myserver.run) 
      p.start() 

     except: 
      pass 

    def sendmessage(self,value): 
     text = self.myobject.get_object('entry1').get_text() 
     print text 
     msg = client.MyClass() 
     p = multiprocessing.Process(target=msg.run,args=([text])) 
     p.start() 

server.py

//打开一个套接字并侦听传入的数据并将其发送回

import socket,multiprocessing, gtk, sys 

class Server: 
    ''' 
    classdocs 
    ''' 
    def __init__(self): 
     ''' 
     Constructor 
     ''' 

    def run(self): 

     try: 
      while 1: 
       HOST = 'localhost'     # Symbolic name meaning the local host 
       PORT = 50006    # Arbitrary non-privileged port 
       s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
       s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
       s.bind((HOST, PORT)) 
       s.listen(5) 
       conn, addr = s.accept() 
       print 'Connected by', addr 
       while True: 
        data = conn.recv(1024) 
        if not data: 
         conn.close() 
         sys.exit() 
         break 
        elif data != '': 
         conn.sendall(data) 
         break 

      print "Closing"  
      #conn.close() 
     finally: 
      print "End" 
      pass 

client.py

//发送无论是内部文本区域插座

import time 

class MyClass: 
    ''' 
    classdocs 
    ''' 

    def __init__(self): 
     ''' 
     Constructor 
     ''' 
    def run(self,text): 
     try: 
      import socket 
      HOST = 'localhost' # The localhost 
      PORT = 50006    # The same port as used by the server 
      s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
      s.connect((HOST, PORT)) 
      s.send(text) 
      data = s.recv(1024) 

      while 1: 
       if data != '': 
        print 'Received', repr(data) 
        break 
     finally: 
      pass 

回答

0

这是错的:

p = multiprocessing.Process(target=gtk.main()) 
p.start() 

首先,你不能在子进程中启动gtk主循环,即使你做得很好。幸运的是,这个过程永远不会真的试图开始main,因为你需要调用gtk.main(),它将阻塞,直到主循环退出,然后返回None。所以你实际上在做什么:

​​

通过其余的代码,你不断创建新的过程,然后忘了它们。如果您要保留对它们的引用,您至少可以尝试发送TERM信号给它们以关闭它们(使用Process.terminate或设置daemon标志)。如果您想要干净地关闭子进程,您可能需要在子进程中使用handle that signal,或者使用其他IPC机制使其完全关闭(如mutliprocessing.Event,...)。

再有是这样的:

  while True: 
       data = conn.recv(1024) 
       if not data: 
        conn.close() 
        sys.exit() 
        break 
       elif data != '': 
        conn.sendall(data) 
        break 

这个while循环将永远循环(除非recv奇迹般地返回别的东西,然后一个字符串)。第一个执行路径以sys.exit()(以整个服务器停机 - 中断无法访问)结束,第二个以break结束,所以循环无用。

下面你几行有完全相反的:

 data = s.recv(1024) 
     while 1: 
      if data != '': 
       print 'Received', repr(data) 
       break 

除非data''在第一线,这将是一个死循环,为data的价值不会改变了。

通常,对于大多数情况,您并不需要进行多处理。在不同的进程中启动服务器可能是好的,如果如果必须做很多工作,但是为了发送一些数据而忽略一个子进程是矫枉过正的。使用套接字发送和接收IO绑定,使用线程更合理。

有两种类(ServerHandler),其仅具有两个方法,其中之一是__init__,并且另一个仅作为目标子进程:

myserver = server.Server() 
    try: 
     p = multiprocessing.Process(target=myserver.run) 

和:

msg = client.MyClass() 
    p = multiprocessing.Process(target=msg.run,args=([text])) 

这是一个迹象,这些不应该是类,但功能。