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

Python多线程-主线程块socket.connect,python,multithreading,sockets,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.sl

我有以下问题。我没有几根线。主线程只等待终止调用,子线程上载文件。不幸的是,当子线程想要连接到特定服务器时,它们会被阻塞。 我在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)
然后在主线程死后,每个子线程都工作(不再被阻塞)

当我尝试连接其他服务器(不是“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()

和Pial.Puxald.PuxAddiDR()包含连接到服务器的代码片段。

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

如果子线程逐个执行,可能套接字服务器不是多线程的问题是,当我只使用一个线程上传所有内容时,一切都正常。如果不止一个子线程在该位置被阻塞。当我在启动子线程后删除主线程时,一切都正常。但我想保留主线。这是GIL做的事情吗?你知道python中线程是如何工作的,是吗?一次只运行一个线程,而GIL在特定时间将控制权交给不同的线程。我认为GIL应该这样做。我正在使用线程。线程库。但看起来,当调用sock.connect时,只有主线程具有控制权。在服务器端,它不允许来自同一客户端的更多连接不是问题吗?您是否可以尝试相同的代码,但每个线程在不同的服务器上运行?您显示的代码应该可以工作;GIL不会阻止并行IO,也不会导致死锁。
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()