为什么python线程在开始时计数为2?

时间:2016-11-07 18:08:29

标签: python multithreading asynchronous python-multithreading

import threading
print threading.activeCount()

输出:2

将此代码保存到文件中并运行。

当它是主线程时,它怎么可能是2?

当我们运行foo.py文件时,除了主线程外,python是否默认运行另一个线程?

3 个答案:

答案 0 :(得分:6)

心理调试:你不是在普通的Python解释器中运行。普通的Python解释器不会启动额外的线程(除非你有一个奇怪的PYTHONSTARTUP文件),但其他解释器会。例如:

  • ipython启动一个额外的线程以在后台保存命令历史记录(以避免延迟提示)
  • IDLE是使用通过套接字进行通信的多个进程设计的,它为您提供的交互式解释器使用守护程序线程来执行后台套接字通信

尝试运行print threading.enumerate();它可能会告诉你后台线程正在做什么(例如,ipython正在使用名为Thread的{​​{1}}子类,HistorySavingThread s是普通IDLE,但是它运行的函数名为Thread,它为您提供了关于它正在做什么的线索。

答案 1 :(得分:0)

默认正在运行的线程是主线程,因此下一个线程将是主线程的子线程,因此它将开始表格计数 2

示例:

thread count is :    1
Enumerate thread count is :  [<_MainThread(MainThread, started 140735135682560)>]
Starting Thread-1
thread count is :    2
Enumerate thread count is :  [<_MainThread(MainThread, started 140735135682560)>, <myThread(Thread-1, started 123145306509312)>]
Starting Thread-2
thread count is :    3
Enumerate thread count is :  [<_MainThread(MainThread, started 140735135682560)>, <myThread(Thread-1, started 123145306509312)>, <myThread(Thread-2, started 123145310715904)>]
Exiting Main Thread
thread count is :    3
Enumerate thread count is :  [<_MainThread(MainThread, started 140735135682560)>, <myThread(Thread-1, started 123145306509312)>, <myThread(Thread-2, started 123145310715904)>]
Thread-1: Thu Jun 28 12:44:35 2018
Thread-1: Thu Jun 28 12:44:36 2018
Thread-2: Thu Jun 28 12:44:36 2018
Thread-1: Thu Jun 28 12:44:37 2018
Thread-1: Thu Jun 28 12:44:38 2018
Thread-2: Thu Jun 28 12:44:38 2018
Thread-1: Thu Jun 28 12:44:39 2018
Exiting Thread-1
Thread-2: Thu Jun 28 12:44:40 2018
Thread-2: Thu Jun 28 12:44:42 2018
Thread-2: Thu Jun 28 12:44:44 2018
Exiting Thread-2
Enumerate thread count is :  [<_MainThread(MainThread, started 140735135682560)>]

答案 2 :(得分:0)

当我在IDLE中运行像您这样的程序时,它返回的线程数为2。 当我在Windows Shell中运行它时,它返回的线程数为1。 因此,显然,IDLE使用了一个额外的线程。

在IDLE中运行threading.enumerate()时,它说有两个线程正在运行: MainThread和SockThread 在Windows Shell中运行相同的代码时,SockThread没有运行。

总而言之,当您在IDLE中运行python代码时,SockThread在后台运行,这会使线程数加1。