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

时间:2014-07-04 13:17:55

标签: python multithreading python-3.x urllib

在以下代码中

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 个答案:

答案 0 :(得分:3)

代码生成线程守护程序线程。

根据threading documentation

  

线程可以标记为“守护程序线程”。这个的意义   flag是只有守护进程线程时整个Python程序退出   留下。初始值继承自创建线程。该   可以通过守护进程属性或守护进程构造函数设置flag   参数。

程序可能会在从服务器返回响应之前结束。

使用非守护程序线程,或使用Thread.join显式等待线程完成启动,而不是使用守护程序线程。

threads = []

for i in range(5):
    t = threading.Thread(target=sendPostRequest)
    t.start()
    threads.append(t)

for t in threads:
    t.join()