为什么多进程会在每个进程中产生多个线程?

2024-10-02 22:33:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是python^{},下面是一个简单的示例:

from multiprocessing import Pool
import time
import signal

def process(_id):
    time.sleep(2)
    return _id

def init_worker():
    signal.signal(signal.SIGINT, signal.SIG_IGN)

def main():
    pool = Pool(1, init_worker)
    for res in pool.imap(process, range(1000)):
        print res

if __name__ == "__main__":
    main()

这很好,让我困惑的是:

^{pr2}$

你可以看到,我刚刚分叉了一个进程,它的pid是4120,所以我认为pid 4119是主进程,但是为什么是4个线程?

需要指出的一点是,并不总是4个线程,例如:

pool = Pool(1, init_worker)
cursor = parse_db["jd_raw"].find({"isExpired": 0},
        {"jdJob.jobPosition": 1, "jdJob.jobDesc": 1, "jdFrom": 1}, no_cursor_timeout=True).\
                batch_size(15)

for res in pool.imap(process, cursor):
    pass

这次是6:

cuidehe   4522  2655  4522 21    6 11:28 pts/25   00:00:00 python test_multi_mongo.py
cuidehe   4522  2655  4525  0    6 11:28 pts/25   00:00:00 python test_multi_mongo.py
cuidehe   4522  2655  4527  0    6 11:28 pts/25   00:00:00 python test_multi_mongo.py
cuidehe   4522  2655  4528 54    6 11:28 pts/25   00:00:01 python test_multi_mongo.py
cuidehe   4522  2655  4529 46    6 11:28 pts/25   00:00:00 python test_multi_mongo.py
cuidehe   4522  2655  4530  0    6 11:28 pts/25   00:00:00 python test_multi_mongo.py
cuidehe   4526  4522  4526 28    1 11:28 pts/25   00:00:00 python test_multi_mongo.py

而且,不仅main process将生成子线程,而且子进程也将生成子线程,那么为什么多进程仍然需要生成子线程?


Tags: pytestimportsignal进程mainmongodef