我使用的是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
将生成子线程,而且子进程也将生成子线程,那么为什么多进程仍然需要生成子线程?
当主程序可以继续运行时,
multiprocessing
模块使用三个独立的线程在后台管理Pool
。请参见Python安装中的multiprocessing/pool.py
。在相关问题 更多 >
编程相关推荐