- 主题:daemon设置为True,子线程也不随主线程结束
试试在linux terminal里运行这个文件,不要在IDE或者windows command line里运行
【 在 giantman 的大作中提到: 】
: 开始学习python中的多线程,可是我发现按照书上的例子,将子线程的daemon无论设成True还是False,结果都一样,子线程都不能随主线程的结束而结束,而且每次运行,结果都不完全一样,不知道是怎么回事?
: 程序如下:
: import threading
: ...................
--
修改:DigitalBeing FROM 76.22.13.*
FROM 76.22.13.*
import threading
import time
def fun():
for i in range(3):
print("fun : %d"%i)
print("[fun]",threading.active_count(), len(threading.enumerate()), threading.enumerate())
time.sleep(1)
th1 = threading.Thread(target=fun)
th1.setDaemon(False)
th1.start()
for i in range(3):
print("main : %d"%i)
print("[main]",threading.active_count(), len(threading.enumerate()), threading.enumerate())
time.sleep(0.5)
# th1.setDaemon(True) 时
fun : 0
main : 0
[fun] 2 2 [<_MainThread(MainThread, started 8607211008)>, <Thread(Thread-1, started daemon 12945776640)>]
[main] 2 2 [<_MainThread(MainThread, started 8607211008)>, <Thread(Thread-1, started daemon 12945776640)>]
main : 1
[main] 2 2 [<_MainThread(MainThread, started 8607211008)>, <Thread(Thread-1, started daemon 12945776640)>]
fun : 1
[fun] 2 2 [<_MainThread(MainThread, started 8607211008)>, <Thread(Thread-1, started daemon 12945776640)>]
main : 2
[main] 2 2 [<_MainThread(MainThread, started 8607211008)>, <Thread(Thread-1, started daemon 12945776640)>]:
# th1.setDaemon(False) 时
fun : 0
main : 0
[fun] 2 2 [<_MainThread(MainThread, started 8636325376)>, <Thread(Thread-1, started 13005135872)>]
[main] 2 2 [<_MainThread(MainThread, started 8636325376)>, <Thread(Thread-1, started 13005135872)>]
main : 1
[main] 2 2 [<_MainThread(MainThread, started 8636325376)>, <Thread(Thread-1, started 13005135872)>]
fun : 1
[fun] 2 2 [<_MainThread(MainThread, started 8636325376)>, <Thread(Thread-1, started 13005135872)>]
main : 2
[main] 2 2 [<_MainThread(MainThread, started 8636325376)>, <Thread(Thread-1, started 13005135872)>]
fun : 2
[fun] 2 2 [<_MainThread(MainThread, stopped 8636325376)>, <Thread(Thread-1, started 13005135872)>]
结论:
1、th1.setDaemon(True)时,main结束,fun线束
2、th1.setDaemon(False)时,fun没有随着主线程退出,fun全部执行完才退出
3、th1.setDaemon(False)时,threading.active_count()=2, 但 main的状态是“.... stopped 8636325376)>....” stoped和active分别啥意思,没想明白...
--
修改:jlsthsdqyx FROM 111.197.116.*
FROM 111.197.116.*
我试了下,输出符合你的期望。Python 3.9.5, Linux。
理论上
The End
reading 0
也是可能的输出。
不过实际似乎总是
reading 0
The End
无论如何,你遇到的像是个bug。不知道什么平台和版本。
另外我也不知道你给的输出里那个>>>是怎么回事。难道你在命令行一行一行输入代码?那当然不行了。
【 在 giantman 的大作中提到: 】
: 多谢提醒。
: 当语句为setDaemon(False)时:
: 我期望的输出是(这是书中给出的输出结果):
: ...................
--
修改:ilovecpp FROM 101.82.192.*
FROM 114.86.93.*
【 在 giantman 的大作中提到: 】
: 开始学习python中的多线程,可是我发现按照书上的例子,将子线程的daemon无论设成True还是False,结果都一样,子线程都不能随主线程的结束而结束,而且每次运行,结果都不完全一样,不知道是怎么回事?
: 程序如下:
: import threading
: ...................
我用 Python 3.7.3 在 Mac 平台下的 PyCharm IDE 中测试,结果完全符合预期. 可能你的Python环境有问题。
代码:
```
import sys
import threading
import time
print(f'\nPython version: {sys.version}\n', end='', flush=True)
def reading(msg: str):
count = 3
for i in range(count):
print(f'{msg}: reading {i+1}/{count}\n', end='', flush=True)
time.sleep(1)
def test(thread_count: int, is_daemon: bool) -> None:
print(f'\n-------- setDaemon({is_daemon}) --------\n', end='', flush=True)
for index in range(thread_count):
r = threading.Thread(target=reading, args=[f'Thread {index+1}'])
r.setDaemon(is_daemon)
r.start()
print('Main thread: The End\n', end='', flush=True)
test(5, True)
```
运行结果:
```
/Users/abc/project/pythonProject/test/venv/bin/python /Users/abc/project/pythonProject/test/my_daemon.py
Python version: 3.7.3 (default, Apr 24 2020, 18:51:23)
[Clang 11.0.3 (clang-1103.0.32.62)]
-------- setDaemon(True) --------
Thread 1: reading 1/3
Thread 2: reading 1/3
Thread 3: reading 1/3
Thread 4: reading 1/3
Thread 5: reading 1/3
Main thread: The End
Process finished with exit code 0
```
代码最后一行改为 `test(5, False)` 后,运行结果:
```
/Users/abc/project/pythonProject/test/venv/bin/python /Users/abc/project/pythonProject/test/my_daemon.py
Python version: 3.7.3 (default, Apr 24 2020, 18:51:23)
[Clang 11.0.3 (clang-1103.0.32.62)]
-------- setDaemon(False) --------
Thread 1: reading 1/3
Thread 2: reading 1/3
Thread 3: reading 1/3
Thread 4: reading 1/3
Thread 5: reading 1/3
Main thread: The End
Thread 1: reading 2/3
Thread 2: reading 2/3
Thread 5: reading 2/3
Thread 4: reading 2/3
Thread 3: reading 2/3
Thread 2: reading 3/3
Thread 5: reading 3/3
Thread 1: reading 3/3
Thread 3: reading 3/3
Thread 4: reading 3/3
Process finished with exit code 0
```
--
修改:galaxy123 FROM 74.88.40.*
FROM 74.88.40.*
我只会用windows,从来没用过linux

不过还是非常非常感谢。
【 在 DigitalBeing 的大作中提到: 】
: 试试在linux terminal里运行这个文件,不要在IDE或者windows command line里运行
:
--
FROM 1.95.148.*
多谢多谢。
不过我的运行结果和您的不同,而且True时,fun也还是在main之后全部运行完。
我用了两个环境测试(虽然结果中顺序不完全一致,但都是true时fun不能随main结束):
一个是python 3.7.3(32-bit),在IDLE中运行。第二个是spyder 5.0.3,里面的python好像是3.8.8 64-bit
【 在 jlsthsdqyx 的大作中提到: 】
: import threading
: import time
: def fun():
: ...................
--
FROM 1.95.148.*
我用了两个环境测试(都是windows,因为我不会用linux,只会用windows):
一个是python 3.7.3(32-bit),在IDLE中运行。第二个是spyder 5.0.3,里面的python好像是3.8.8 64-bit
我不是在IDLE中一行行敲的代码,是写了一个.py的文件,然后运行得到的结果。
>>>是显示运行结果的IDLE中自带的,说明后面跟的是运行结果,全景是下面这个样子。
Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 21:26:53) [MSC v.1916 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license()" for more information.
>>>
=== RESTART: D:\example3-3-1.py ===
The Endreading
>>> 0
reading 1
reading 2
【 在 ilovecpp 的大作中提到: 】
: 我试了下,输出符合你的期望。Python 3.9.5, Linux。
: 理论上
: The End
: ...................
--
FROM 1.95.148.*
多谢多谢,看了大家的回复后,我也逐渐感觉是我的运行环境有问题,准备换个pycharm试试。
【 在 galaxy123 的大作中提到: 】
:
: 我用 Python 3.7.3 在 Mac 平台下的 PyCharm IDE 中测试,结果完全符合预期. 可能你的Python环境有问题。
: 代码:
: ...................
--
FROM 1.95.148.*
实践证明,果然是运行环境的问题。
我换了Pycharm之后,就能得到和书中一样的结果了。
【 在 giantman 的大作中提到: 】
: 多谢多谢,看了大家的回复后,我也逐渐感觉是我的运行环境有问题,准备换个pycharm试试。
:
--
FROM 1.95.148.*