【问题标题】:Why does threading.Thread operate synchronously by blocking execution in python 2.5?为什么threading.Thread在python 2.5中通过阻塞执行来同步操作?
【发布时间】:2014-11-17 18:48:52
【问题描述】:

我仅限于python2.5,我认为threading.Thread是异步的。我运行: python t.py 并且脚本直到 3 秒后才返回到 shell,这意味着它被阻塞了。为什么会阻塞?

我的代码:

#!/usr/bin/python
import threading,time

def doit():
  time.sleep(3)
  print "DONE"

thr = threading.Thread(target=doit, args=(), kwargs={})
thr.start() # will run "foo"

【问题讨论】:

  • 您能否更具体地说明在这种情况下“同步”的含义?您希望看到什么行为?你到底看到了什么?
  • 好问题,在 python 2.x 上线程总是对我来说是错误的。它在 python 3 中工作正常。编辑:在 python 2.7.6 中尝试过,现在可以工作,所以可能是早期版本的 python 中的一个错误
  • @dano 我在问题中添加了更多信息。请重读,谢谢!

标签: python multithreading python-2.5


【解决方案1】:

默认情况下,Python 中的线程是非守护进程的。一个 Python 应用程序 will not exit 直到所有非守护线程都完成,所以在你的情况下它不会退出直到 doit 完成。如果您希望脚本在到达主线程结束时立即退出,您需要通过在启动线程之前设置daemon attribute 使线程成为守护进程:

thr = threading.Thread(target=doit, args=(), kwargs={})
thr.daemon = True
thr.start()

【讨论】:

  • 好。现在 stdout 在守护模式下去哪里了?
  • @hunterp:daemon 线程在 Python 退出后不会继续运行。
  • @hunterp 标准输出在所有线程之间共享。当 Python 进程退出时,它就关闭了。
【解决方案2】:

Python 中的线程是“一种”异步的。这是什么意思?

  • 一次只能有一个线程运行 Python 代码

  • Python 代码和 CPU 密集型线程不会受益

您的问题似乎是您认为 Python 线程应该在 Python 本身退出后继续运行——这不是它的工作方式。如果您确实将线程设为daemon,那么当 Python 退出时,这些线程就会立即死掉——没有清理,没有错误恢复,就死了。

如果你想真正创建一个守护进程,在主应用程序退出后继续在后台运行的东西,你想看看os.fork()。如果你想用更简单的方法来做,你可以试试我的守护进程库,pandaemonium

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多