2013-07-10 186 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