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

ptikobj

在下面的代码中

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)但是,已达到该行为什么会这样呢?

虚假的

该代码使线程守护程序线程成为线程。

根据threading文件

线程可以标记为“守护程序线程”。该标志的重要性在于,仅保留守护程序线程时整个Python程序都会退出初始值是从创建线程继承的。可以通过daemon属性或daemon构造函数参数设置该标志。

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

代替使用守护线程,可以使用非守护线程,或者显式地等待线程完成使用开始Thread.join

threads = []

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

for t in threads:
    t.join()

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么在这种情况下 sprintf 会崩溃?

为什么在这种情况下会丢失git commit?

为什么在这种特殊情况下数据类型会影响性能?

为什么在这种情况下TypeScript类型推断会失败?

为什么在这种情况下算术运算会返回NaN?

FMX:为什么在这种特殊情况下 TTextLayout.RegionForRange 会失败?

为什么 std::move 在这种情况下会导致 SEGFAULT?

为什么 Panda 在这种情况下会返回 ValueError ?

for 循环 - 为什么 range(len()) 会导致 TypeError: int not subscriptable 在这种情况下?

为什么在这种情况下L_BFGS_B优化会跳到可行解决方案的极限范围?

为什么在这种简单情况下Typescript会推断出一个空对象

在这种情况下,什么会导致User :: destroy($ id)实际删除条目?

“在这种情况下”使用数组会产生什么不良后果?

为什么在这种情况下调用ES6会“保留”保留字?

在这种情况下,数组会取消分配吗?

servlet的getMethod在这种情况下会执行吗?

Swift在这种情况下会复制突变吗?

在这种情况下,我们使用$ _REQUEST变量而不是$ _GET或$ _POST变量

在这种情况下,java堆会跳到磁盘上吗?

在这种特定情况下,更快的IO会导致结果变慢

在这种情况下,Spring会创建父bean吗?

在这种情况下,gargabe收集器会重新收集该对象吗?

在这种情况下,垃圾收集器会破坏我的对象吗?

在这种情况下使用SecureString会提高安全性吗?

在这种情况下 git rebase 会返回相同的哈希吗?

为什么在这种情况下需要引用/借用?

为什么在这种情况下转发参考无效?

为什么在这种情况下Array的元素是可选的?

为什么std :: forward在这种情况下无用