为什么urllib.request.urlopen在这种情况下会阻塞?

0 投票
1 回答
1530 浏览
提问于 2025-04-18 12:07

在下面的代码中

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()

撰写回答