2013-07-10 140 views
1

我一直在尝试编写一个python脚本,它启动一个线程来侦听套接字并将HTTP数据发送给另一个应用程序,以便由同一程序启动。在执行应用程序之前,需要运行套接字服务器。但是,运行套接字服务器的线程会阻止程序的进一步执行,并冻结正在侦听的地方。放一些虚拟代码。Python线程阻塞进一步执行

在模块1:

def runServer(Port, Host, q): 
    HTTPServerObj = HTTPServer((Host, Port), RequestHandler) 
    HTTPServerObj.handle_request() 
    HTTPServerObj.server_close() 
    q.put((True, {'messageDoNotDuplicate': 'Data sent successfully by the server'})) 

class SpoofHTTPServer(object): 
    def runServerThread(self): 
     q = Queue.Queue() 
     serverThread=Thread(target=runServer, args=(self.Port, self.Host, q)) 
     serverThread.daemon=True 
     serverThread.start() 
     result = q.get() 
     print result 
     return result 

在模块2:

from module1 import SpoofHTTPServer 

spoofHTTPServer = SpoofHTTPServer() 
result = spoofHTTPServer.runServerThread() 
rc = myApp.start() 

的myApp.start()永远不会被作为线程阻塞它执行。

回答

1

它看起来像阻止执行的方法不是线程,而是q.get()。它会监听Queue,直到某个项目可用,但由于它在运行客户端应用程序之前执行,所以没有任何内容会被发布到队列中。也许你应该return q而不是在调用myApp.start()之后收听模块2中的队列?

+0

根据http://docs.python.org/2/library/queue.html#Queue.Queue.get它看起来像一个可以使用非阻塞调用get(假)或get_nowait() ,如果这是所需的行为。 – woozyking

+0

@woozyking:是的,但在这种情况下,它总是会引发'Empty'异常,因为将数据插入队列的代码还没有执行。 – Kaivosukeltaja

+0

我明白了。谢谢! – woozyking

0

这可能适用于Python 3的用户。建立与('localhost', 8080)的连接以查看其工作。

import queue as Queue 
from threading import Thread 
from http.server import HTTPServer 
from socketserver import BaseRequestHandler as RequestHandler 

def runServer(Port, Host, q): 
    HTTPServerObj = HTTPServer((Host, Port), RequestHandler) 
    HTTPServerObj.handle_request() 
    HTTPServerObj.server_close() 
    q.put((True, {'messageDoNotDuplicate': 
        'Data sent successfully by the server'})) 

class SpoofHTTPServer(object): 

    Port = 8080 
    Host = '' 

    def runServerThread(self): 
     q = Queue.Queue() 
     serverThread=Thread(target=runServer, args=(self.Port, self.Host, q)) 
     serverThread.daemon=True 
     serverThread.start() 
     result = q.get() 
     print(result) 
     return result 

spoofHTTPServer = SpoofHTTPServer() 
result = spoofHTTPServer.runServerThread() 
##rc = myApp.start() 
+1

我正在这样做,只是没有在我发布的代码中提到。对于那个很抱歉。 :( – Shabareesh