2012-08-05 140 views
3

我有以下问题。我有几个线程。有主线程只等待终止呼叫和线程 - 上传文件的子节点。不幸的是,当他们想要与特定服务器连接时,子线程被阻塞。 我在Linux上使用python2.7。Python多线程 - 主线程块socket.connect

主线程包含此代码:

for i in xrange(n): 
     upl = UploaderThread(self.user, self.password) 
     upl.start() 
    while threading.active_count() > 1: 
     time.sleep(1000.) 

这是那里的孩子,朝不保夕

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    sock.settimeout(glob_timeout) 
    #this fragment of code is accessed 
    sock.connect(("95.211.193.147", 8084)) <- here the child-thread is blocked 
    #this fragment of code is not accessed anymore 
    sock.send(header) 

我该怎么办错了的片段?


当我运行几个副本的同一个程序(每个副本是一个上传线程),一切都很好。这意味着服务器允许来自一个客户端的多个连接。

一切正常,当我改变主线程以这种方式(去除等待循环)时,没有主线程 即 :

for i in xrange(n): 
     upl = UploaderThread(self.user, self.password) 
     upl.start() 

然后主线程死亡后,每个子线程作品(是不再被阻挡)。

当我尝试与其他服务器(不是“95.211.193.147”,8084)连接时,子线程不会被主线程阻塞。

我真的不明白是怎么回事。 UploaderThread

class UploaderThread(threading.Thread): 
    def __init__(self, user, password): 
     threading.Thread.__init__(self) 
     self.uploader = Uploader(user, password) 
     self.daemon  = False 

    def run(self): 
     self.uploader.upload_dir() 

和self.uploader.upload_dir()的


定义包含代码段与连接到服务器。

+0

如果子线程逐个执行,也许套接字服务器不是多线程 – xiaowl 2012-08-05 11:43:15

+0

事情是,当我只起诉一个线程上传一切都OK。如果多于每个子线程都被阻塞在那个地方。 当我启动子线程后删除主线程,然后一切正常。但我想保持主线程。 – Anonim33 2012-08-05 11:50:06

+1

这是GIL做它的事情吗?你知道线程是如何在Python中工作的,是的?一次只能运行一个线程,并且GIL在特定时间将控制权交给不同的线程。 – 2012-08-05 12:01:50

回答

0

您可能想考虑使用多处理库而不是线程。它有一些限制,但它回避了GIL问题。