奇怪的进程克隆与python multiprocessing一起出现

盖夫洛克

我面临着一个非常奇怪的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中,我看到以下内容:htop示范而且看起来PID 13322的过程实际上是一个线程。问题是什么?谁产生的?为什么?如果我将SIGUSR1发送到此PID,则会在输出中看到:

10 <frame object at 0x7f05c14ed5d8>
This is Writer( 13258 )

这个问题与以下问题略有相关:Python多处理:比请求更多的进程

Noxdafox

线程属于Queue对象。

它在内部使用线程在Pipe上调度数据。

文档

类multiprocessing.Queue([maxsize])

返回使用管道和一些锁/信号量实现的进程共享队列。当进程首先将项目放入队列,将启动一个供料器线程,该线程将对象从缓冲区转移到管道中。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Java中将Reduce与prallelstream一起使用时出现奇怪的结果

来自分类Dev

与NotifyIcon一起使用时会出现奇怪的ContextMenuStrip样式

来自分类Dev

与在Python共享队列使用线程和进程一起

来自分类Dev

如何使Maven与Python子进程一起使用?

来自分类Dev

将管道与python“子进程”模块一起使用

来自分类Dev

使用python启动openoffice进程以与pyuno一起使用

来自分类Dev

将管道与python“子进程”模块一起使用

来自分类Dev

在Python中将MySQL与AWS Lambda一起使用时出现问题

来自分类Dev

在Python中将.sample()与.where()一起使用时出现不良结果

来自分类Dev

与Tkinter一起使用时StingVar()在Python中出现错误

来自分类Dev

使python 2.7与我的django项目一起使用时出现问题

来自分类Dev

在iOS 10上将UISearchController与UITableViewController一起使用时,UITableView标头处出现奇怪的空白

来自分类Dev

将Spark 2.4.3(EMR 5.25.0)与Delta Lake IO 0.6.0一起使用时出现奇怪的非严重异常

来自分类Dev

angular2:将ngFor与应该表示表格行的模板一起使用时出现奇怪的结果

来自分类Dev

与Django一起使用的virtualenv python3中的psycopg2出现问题

来自分类Dev

当将text()与python-escpos一起使用时,出现[Errno None]并且键错误= 1(Windows 10)

来自分类Dev

PYTHON参数与列表一起传递

来自分类Dev

查询 sql 与 python 一起使用

来自分类Dev

没有子Python的输出与子进程一起执行

来自分类Dev

Python子进程,将rsync与ssh密钥文件一起使用,方法Call出错

来自分类Dev

Bash 脚本不会与 Python 中的子进程一起运行

来自分类Dev

与grep 一起使用时Python 子进程调用卡住|

来自分类Dev

一起使用dataclass和property的奇怪问题

来自分类Dev

与向量iterato一起使用时输出奇怪

来自分类Dev

异步函数与 Promises 一起工作很奇怪

来自分类Dev

将execl与多个子进程一起使用

来自分类Dev

您如何与后台进程一起管理模块实例?

来自分类Dev

django与主管一起启动celery守护进程的生产

来自分类Dev

xargs 和 kill 不能一起杀死特定进程

Related 相关文章

  1. 1

    在Java中将Reduce与prallelstream一起使用时出现奇怪的结果

  2. 2

    与NotifyIcon一起使用时会出现奇怪的ContextMenuStrip样式

  3. 3

    与在Python共享队列使用线程和进程一起

  4. 4

    如何使Maven与Python子进程一起使用?

  5. 5

    将管道与python“子进程”模块一起使用

  6. 6

    使用python启动openoffice进程以与pyuno一起使用

  7. 7

    将管道与python“子进程”模块一起使用

  8. 8

    在Python中将MySQL与AWS Lambda一起使用时出现问题

  9. 9

    在Python中将.sample()与.where()一起使用时出现不良结果

  10. 10

    与Tkinter一起使用时StingVar()在Python中出现错误

  11. 11

    使python 2.7与我的django项目一起使用时出现问题

  12. 12

    在iOS 10上将UISearchController与UITableViewController一起使用时,UITableView标头处出现奇怪的空白

  13. 13

    将Spark 2.4.3(EMR 5.25.0)与Delta Lake IO 0.6.0一起使用时出现奇怪的非严重异常

  14. 14

    angular2:将ngFor与应该表示表格行的模板一起使用时出现奇怪的结果

  15. 15

    与Django一起使用的virtualenv python3中的psycopg2出现问题

  16. 16

    当将text()与python-escpos一起使用时,出现[Errno None]并且键错误= 1(Windows 10)

  17. 17

    PYTHON参数与列表一起传递

  18. 18

    查询 sql 与 python 一起使用

  19. 19

    没有子Python的输出与子进程一起执行

  20. 20

    Python子进程,将rsync与ssh密钥文件一起使用,方法Call出错

  21. 21

    Bash 脚本不会与 Python 中的子进程一起运行

  22. 22

    与grep 一起使用时Python 子进程调用卡住|

  23. 23

    一起使用dataclass和property的奇怪问题

  24. 24

    与向量iterato一起使用时输出奇怪

  25. 25

    异步函数与 Promises 一起工作很奇怪

  26. 26

    将execl与多个子进程一起使用

  27. 27

    您如何与后台进程一起管理模块实例?

  28. 28

    django与主管一起启动celery守护进程的生产

  29. 29

    xargs 和 kill 不能一起杀死特定进程

热门标签

归档