Python多线程 - 主线程块socket.connect

时间:2012-08-05 11:40:26

标签: python multithreading sockets

我有以下问题。我的线程很少。主要线程只等待终止调用和上传文件的线程子节点。不幸的是,当他们想要连接特定服务器时,子线程被阻止。 我在Linux上使用python2.7。

主线程包含以下代码:

    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()包含与服务器连接的代码段。

1 个答案:

答案 0 :(得分:0)

您可能需要考虑使用多处理库而不是线程。它有一些局限性,但它避开了GIL问题。