2013-03-14 3 views
4

Я недавно работал над программой (как вы можете видеть из моего предыдущего вопроса), и у меня возникли проблемы с пониманием и реализацией многопоточности.Многопоточность в python - Блокировка вызова в фоновом режиме

Я следил за учебником (binary tides) для настройки UDP-сервера, который отлично работает. Тем не менее, проблема заключается в том, что когда я создаю блокирующий UDP-сокет в новом потоке, код, который у меня есть в моей основной программе, где я изначально создал поток, не работает. Вот некоторые из моего кода:

main.py:

from thread import* 
import connections 


start_new_thread(networkStart.startConnecton()) 
print 'This should print!' 

networkStart.py:

def startConnecton(): 
    userData.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    print 'Socket created' 
    try: 
     userData.s.bind((HOST, PORT)) 
    except socket.error, msg: 
     print 'Bind failed. Error code: ' +str(msg[0]) + 'Message' +msg[1] 
     sys.exit() 
    print 'Socket bind complete' 
    userData.s.listen(10) 
    # Set the socket to listening mode, if there are more than 10 connections waiting reject the rest 
    print 'Socket now listening' 
    #Function for handling connections. Each new connection is handled on a separate thread 
    start_new_thread(connections.connectionListen()) 

connections.py:

def connectionListen(): 
    while 1: 
      print 'waiting for connection' 
      #wait to accept a connection - blocking call 
      conn, addr = userData.s.accept() 
      userData.clients += 1 
      print 'Connected with ' + addr[0] + ':' + str(addr[1]) 
      #start new thread takes 1st argument as a function name to be run, second is the tuple of arguments 
      start_new_thread(users.clientthread ,(conn, userData.clients)) 

я в основном просто хочу быть способный выполнить любой код в main.py после того, как функция startConnection вызывается в новом потоке (т. е. печатает строку в этом экземпляре) ,

Я долгое время боролся с этой программой, Python для меня новичок, и мне кажется, что это довольно сложно. Я предполагаю, что я должен делать некоторые ошибки в том, как я реализовал многопоточность, любая помощь будет очень признательна!

+0

Это полный код? Какие ошибки вы получаете? Вызов 'start_new_thread' выглядит недействительным. –

ответ

5

start_new_thread получает список функций и аргументов, но вы используете непосредственно вызов функции: start_new_thread(networkStart.startConnecton()).

Однако я рекомендую использовать модуль threading (the official documentation does so), который имеет более высокий уровень абстракции.

import threading 
import connections 

threading.Thread(target=networkStart.startConnecton).start() 
print 'This should print!' 
+0

Работал отлично, спасибо –