What is a python thread
我有几个关于Python线程的问题。
A thread can be flagged as a"daemon thread". The significance of this
flag is that the entire Python program exits when only daemon threads
are left.
我的解释/理解是:当所有非守护进程线程终止时,主线程终止。
所以,如果"只剩下守护进程线程,整个python程序就退出了",那么python守护进程线程就不是python程序的一部分了?
在我知道的所有实现(c python、pypy和jython)中,python线程都是使用操作系统线程实现的。对于每个python线程,都有一个底层的OS线程。
一些操作系统(其中之一是Linux)在所有运行进程的列表中显示由同一可执行文件启动的所有不同线程。这是操作系统的实现细节,而不是Python。在其他一些操作系统上,列出所有进程时可能看不到这些线程。
当最后一个非守护进程线程完成时,进程将终止。此时,所有守护进程线程都将终止。因此,这些线程是进程的一部分,但不会阻止它终止(而常规线程将阻止它)。这是在纯Python中实现的。当调用系统
守护进程线程标志由
此功能的代码为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | class _MainThread(Thread): def _exitfunc(self): self._Thread__stop() t = _pickSomeNonDaemonThread() if t: if __debug__: self._note("%s: waiting for other threads", self) while t: t.join() t = _pickSomeNonDaemonThread() if __debug__: self._note("%s: exiting", self) self._Thread__delete() |
当调用
当调用
所有线程都是进程的一部分。
My interpretation/understanding was: main thread terminates when all
non-daemon threads are terminated.So python daemon threads are not part of python program if"the entire
Python program exits when only daemon threads are left"?
你的理解是错误的。对于操作系统,进程由许多线程组成,所有线程都是相等的(操作系统的主线程没有什么特别的,除了C运行时在
python解释器使用本机线程来实现python线程,但必须记住创建的线程列表。并且使用它的
下面的程序可以帮助理解守护进程线程和常规线程之间的区别:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | import sys import time import threading class WorkerThread(threading.Thread): def run(self): while True: print 'Working hard' time.sleep(0.5) def main(args): use_daemon = False for arg in args: if arg == '--use_daemon': use_daemon = True worker = WorkerThread() worker.setDaemon(use_daemon) worker.start() time.sleep(1) sys.exit(0) if __name__ == '__main__': main(sys.argv[1:]) |
如果您使用"--使用守护进程"执行这个程序,您将看到该程序只会打印少量的
我对实现不熟悉,所以让我们做一个实验:
1 2 3 4 5 6 7 8 9 10 11 12 13 | import threading import time def target(): while True: print 'Thread working...' time.sleep(5) NUM_THREADS = 5 for i in range(NUM_THREADS): thread = threading.Thread(target=target) thread.start() |
使用
我不确定
我在开始线程之前添加了以下行:
1 | thread.daemon = True |
当我执行使用cpython时,程序几乎立即终止,并且没有使用
注意:我在java1.6.0.u 23上使用了Ubuntu11.10和python 2.7.2+以及jython2.2.1。
python线程实际上是一个解释器实现,因为所谓的全局解释器锁(gil),即使它在技术上使用操作系统级线程机制。在*nix上,它使用pthreads,但是gil有效地使它成为应用程序级线程范例的混合体。因此,您将在*nix系统上以ps/top输出多次看到它,但它的行为(性能方面)仍然类似于软件实现的线程。
不,您只是看到了操作系统的底层线程实现。这种行为是由*nix pthread-like线程暴露的,或者我告诉Windows也这样实现线程。
当程序关闭时,它也会等待所有线程完成。如果您有线程,这可能会延迟退出,明智的做法是将这些线程标记为"守护进程",并允许您的程序完成,即使这些线程仍在运行。
您可能感兴趣的一些参考资料:
- Linux公报:了解Python中的线程。
- DougHellman:Python中的多处理技术
- David Beazley:Pycon 2010:了解python gil(视频演示)
这个问题有很好的答案,但是我觉得守护进程线程的问题仍然没有简单的解释。所以这个答案只涉及第三个问题
"main thread terminates when all non-daemon threads are terminated."
So python daemon threads are not part of Python program if"the entire Python program exits when only daemon threads are left"?
如果您考虑到守护进程是什么,它通常是一个服务。在无限循环中运行的一些代码,用于服务请求、填充队列、接受连接等。其他线程使用它。当它自己运行时(在单个进程术语中),它没有任何用途。
所以程序不能等待守护进程线程终止,因为它可能永远不会发生。当所有非守护进程线程都完成时,python将结束程序。它还停止守护进程线程。
要等待守护进程线程完成其工作,请使用