为什么urllib.request.urlopen在这种情况下会阻塞?
在下面的代码中
def sendPostRequest():
request = urllib.request.Request(myURL, myBody, myHeaders)
print("created POST request", request)
response = urllib.request.urlopen(request)
print("finished POST", response)
for i in range(5):
t = threading.Thread(target=sendPostRequest)
t.daemon = True # thread dies when main thread (only non-daemon thread) exits.
t.start()
,这一行 print("finished POST", response)
从来没有被执行到,而我在服务器的日志中可以看到请求成功到达了。不过,另一行 print("created POST request", request)
是被执行到的。
这是什么原因呢?
1 个回答
3
这段代码创建了守护线程。
根据threading
的文档:
一个线程可以被标记为“守护线程”。这个标记的意思是,当只剩下守护线程的时候,整个Python程序会退出。这个标记的初始值是从创建它的线程那里继承来的。你可以通过守护属性或者构造函数的参数来设置这个标记。
程序可能在从服务器返回响应之前就结束了。
与其使用守护线程,不如使用非守护线程,或者明确等待线程完成,可以使用Thread.join
。
threads = []
for i in range(5):
t = threading.Thread(target=sendPostRequest)
t.start()
threads.append(t)
for t in threads:
t.join()