我面临着一个非常奇怪的Python行为。看起来当我启动使用多处理的并行程序时,在主进程中又产生了2个(生产者,使用者),我看到有4个进程在运行。我认为应该只有3个:主要,生产者,消费者。但是过了一段时间,第四个过程出现了。
我已经做了一个最小的代码示例来重现该问题。它创建两个使用递归计算斐波纳契数的过程:
from multiprocessing import Process, Queue
import os, sys
import time
import signal
def fib(n):
if n == 1 or n == 2:
return 1
result = fib(n-1) + fib(n-2)
return result
def worker(queue, amount):
pid = os.getpid()
def workerProcess(a, b):
print a, b
print 'This is Writer(', pid, ')'
signal.signal(signal.SIGUSR1, workerProcess)
print 'Worker', os.getpid()
for i in range(0, amount):
queue.put(fib(35 - i % 4))
queue.put('end')
print 'Worker finished'
def writer(queue):
pid = os.getpid()
def writerProcess(a, b):
print a, b
print 'This is Writer(', pid, ')'
signal.signal(signal.SIGUSR1, writerProcess)
print 'Writer', os.getpid()
working = True
while working:
if not queue.empty():
value = queue.get()
if value != 'end':
fib(32 + value % 4)
else:
working = False
else:
time.sleep(1)
print 'Writer finished'
def daemon():
print 'Daemon', os.getpid()
while True:
time.sleep(1)
def useProcesses(amount):
q = Queue()
writer_process = Process(target=writer, args=(q,))
worker_process = Process(target=worker, args=(q, amount))
writer_process.daemon = True
worker_process.daemon = True
worker_process.start()
writer_process.start()
def run(amount):
print 'Main', os.getpid()
pid = os.getpid()
def killThisProcess(a, b):
print a, b
print 'Main killed by signal(', pid, ')'
sys.exit(0)
signal.signal(signal.SIGTERM, killThisProcess)
useProcesses(amount)
print 'Ready to exit main'
while True:
time.sleep(1)
def main():
run(1000)
if __name__=='__main__':
main()
我在输出中看到的是:
$ python python_daemon.py
Main 13257
Ready to exit main
Worker 13258
Writer 13259
但是在htop中,我看到以下内容:而且看起来PID 13322的过程实际上是一个线程。问题是什么?谁产生的?为什么?如果我将SIGUSR1发送到此PID,则会在输出中看到:
10 <frame object at 0x7f05c14ed5d8>
This is Writer( 13258 )
这个问题与以下问题略有相关:Python多处理:比请求更多的进程
线程属于Queue对象。
它在内部使用线程在Pipe上调度数据。
从文档:
类multiprocessing.Queue([maxsize])
返回使用管道和一些锁/信号量实现的进程共享队列。当进程首先将项目放入队列时,将启动一个供料器线程,该线程将对象从缓冲区转移到管道中。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句