2013-07-10 5 views
1

Я пытаюсь написать скрипт python, который инициирует поток для прослушивания сокета и отправки HTTP-данных в другое приложение, которое будет запущено той же самой программой. Перед запуском приложения необходимо, чтобы сервер сокета выполнялся. Тем не менее поток, выполняющий сервер сокета, блокирует дальнейшее выполнение программы, и он зависает там, где он прослушивает. Поместите некоторый фиктивный код.Python thread blocking дальнейшее выполнение

В модуле 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 вместо этого и слушать очередь в модуле 2 после вызова myApp.start()?

+0

Согласно http://docs.python.org/2/library/queue.html#Queue.Queue.get, похоже, можно использовать Get (False) или 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

Смежные вопросы