【发布时间】:2021-11-29 08:12:53
【问题描述】:
我有一个创建 2 个新进程的 python 脚本。然后,在每个新进程中,我创建 3 个线程。
import os
import threading
import multiprocessing as mp
import time
def extra_threads():
x = 7
while x != 0:
x -= 1
for specific_thread in threading.enumerate():
print('THREAD:', specific_thread, f'X Value: {x},', os.getpid())
def new_process():
print('PROCESS: New Process PID:', os.getpid())
print('PROCESS: Thread Count:',
threading.active_count())
for specific_thread in threading.enumerate():
print('PROCESS:', specific_thread)
print('PROCESS: CREATING 3 ADDITIONAL THREADS IN PID:', os.getpid())
for y in range(3):
t = threading.Thread(target=extra_threads)
t.setDaemon(True)
t.start()
print('PROCESS: Thread Count: ', threading.active_count(), 'PID:', os.getpid())
while True:
pass
if __name__ == '__main__':
# display information about this process
print('Parent Process ID: ', os.getpid()) # Get's the unique Process ID of this process
print('Parent Thread Count: ', threading.active_count()) # Shows that it is initially 1 thread to his process
for thread in threading.enumerate():
print('MAIN PROGRAM THREADS:', thread) # Prints information about each of those threads
print('\nSTARTING 2 NEW PROCESSES...')
print()
for z in range(2):
print(f'Starting {z + 1} New Process...')
print()
mp.Process(target=new_process).start()
time.sleep(1)
print()
当我查看终端的进程时,输出符合预期。 我有 2 个进程 (ps -eF) 和每个进程的 3 个线程(当我运行 ps -L 时)。
但是,对于每个进程中的每个线程,打印语句(在 extra_thread() 函数中)在终端出现两次。这可以通过重复多次打印的 X 值来观察。
有人能解释为什么会这样吗?
THREAD: <_MainThread(MainThread, started 140020333217600)> X Value: 6, 449
**THREAD: <Thread(Thread-1, started daemon 140020326205184)> X Value: 6, 449**
THREAD: <_MainThread(MainThread, started 140020333217600)> X Value: 6, 449
THREAD: <_MainThread(MainThread, started 140020333217600)> X Value: 5, 449
THREAD: <_MainThread(MainThread, started 140020333217600)> X Value: 6, 449
**THREAD: <Thread(Thread-1, started daemon 140020326205184)> X Value: 6, 449
THREAD: <Thread(Thread-1, started daemon 140020326205184)> X Value: 6, 449**
THREAD: <Thread(Thread-2, started daemon 140020317751040)> X Value: 6, 449
THREAD: <Thread(Thread-1, started daemon 140020326205184)> X Value: 5, 449
THREAD: <Thread(Thread-3, started daemon 140020309296896)> X Value: 6, 449
THREAD: <Thread(Thread-2, started daemon 140020317751040)> X Value: 5, 449
THREAD: <_MainThread(MainThread, started 140020333217600)> X Value: 5, 449
THREAD: <Thread(Thread-1, started daemon 140020326205184)> X Value: 5, 449
THREAD: <Thread(Thread-3, started daemon 140020309296896)> X Value: 5, 449
THREAD: <_MainThread(MainThread, started 140020333217600)> X Value: 4, 449
THREAD: <Thread(Thread-2, started daemon 140020317751040)> X Value: 5, 449
THREAD: <Thread(Thread-1, started daemon 140020326205184)> X Value: 4, 449
THREAD: <Thread(Thread-3, started daemon 140020309296896)> X Value: 5, 449
THREAD: <Thread(Thread-2, started daemon 140020317751040)> X Value: 4, 449
THREAD: <_MainThread(MainThread, started 140020333217600)> X Value: 4, 449
THREAD: <Thread(Thread-3, started daemon 140020309296896)> X Value: 4, 449
THREAD: <Thread(Thread-1, started daemon 140020326205184)> X Value: 4, 449
THREAD: <_MainThread(MainThread, started 140020333217600)> X Value: 3, 449
THREAD: <Thread(Thread-1, started daemon 140020326205184)> X Value: 3, 449
...
THREAD: <Thread(Thread-1, started daemon 140020326205184)> X Value: 5, 450
THREAD: <Thread(Thread-3, started daemon 140020309296896)> X Value: 5, 450
THREAD: <Thread(Thread-2, started daemon 140020317751040)> X Value: 5, 450
THREAD: <Thread(Thread-1, started daemon 140020326205184)> X Value: 4, 450
THREAD: <Thread(Thread-3, started daemon 140020309296896)> X Value: 5, 450
THREAD: <Thread(Thread-2, started daemon 140020317751040)> X Value: 4, 450
THREAD: <Thread(Thread-3, started daemon 140020309296896)> X Value: 4, 450
THREAD: <Thread(Thread-1, started daemon 140020326205184)> X Value: 4, 450
THREAD: <Thread(Thread-1, started daemon 140020326205184)> X Value: 3, 450
是不是因为在新进程线程中调用了print语句(打印“there”也打印在父进程中?
另外,线程信息中“started daemon”后面的数字是多少?如果是内存地址,为什么跨不同进程的子线程都一样? (主线程地址与生成的所有 2 个进程不同,这是意料之中的)。
谢谢!
【问题讨论】:
标签: python linux multithreading multiprocessing