我在python中学习多处理.我尝试了多处理,在读完多处理模块的源代码之后,我发现它使用了os.fork(),所以我写了一些代码来测试os.fok(),但是我被困了.我的代码如下:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import time
for i in range(2):
print '**********%d***********' % i
pid = os.fork()
print "Pid %d" % pid
Run Code Online (Sandbox Code Playgroud)
我认为每次打印都会执行两次,但执行三次.我无法理解这是如何工作的?我读过这个需要知道fork是如何工作的?
从这篇文章中说它也将被执行两次,所以我被困......
我想multiprocessing从这个例子开始尝试不同的使用方法:
$ cat multi_bad.py
import multiprocessing as mp
from time import sleep
from random import randint
def f(l, t):
# sleep(30)
return sum(x < t for x in l)
if __name__ == '__main__':
l = [randint(1, 1000) for _ in range(25000)]
t = [randint(1, 1000) for _ in range(4)]
# sleep(15)
pool = mp.Pool(processes=4)
result = pool.starmap_async(f, [(l, x) for x in t])
print(result.get())
Run Code Online (Sandbox Code Playgroud)
这里l是一个列表,当生成4个进程时,它会被复制4次.为避免这种情况,文档页面提供了使用队列,共享数组或代理对象multiprocessing.Manager.对于最后一个,我改变了以下定义l:
$ diff multi_bad.py multi_good.py
10c10,11
< l …Run Code Online (Sandbox Code Playgroud)