Python运行函数与主代码并行

时间:2019-05-07 19:17:53

标签: python function multiprocessing python-multiprocessing

我有以下代码(在Windows 64位上为Python 3.7):

from time import sleep
import time
from multiprocessing import Process

### function ###
def func(l):

     for i in l:
         sleep(1)
         print (i)
         t1 = time.time()
         total = t1-t0
         print ('time : ',total)


### main code ###
t0 = time.time()
l = list(range(1, 4))

if __name__ == '__main__':
     p = Process(target=func, args=(l,))
     p.start()
     p.join()

sleep(10)
print ('done')

t1 = time.time()
total = t1-t0
print ('time : ',total)

目标是让一个函数与代码的主要块并行运行。运行此命令时,将得到以下结果:

done
time :  10.000610828399658
1
time :  11.000777244567871
2
time :  12.001059532165527
3
time :  13.00185513496399
done
time :  23.11873483657837

但是我期望以下几点:

1
time: ~1
2
time: ~2
3
time: ~3
done
time: ~10

所以从本质上讲,我希望函数与主代码并行运行。我很困惑,因为如果不进行多处理,此代码最多应运行13秒,但运行23天。目标是在10秒内运行。

如何解决此问题以使其按预期工作?

1 个答案:

答案 0 :(得分:1)

我无法重现第一次打印的时间是〜10的问题,当我尝试打印时,得到的时间是从〜1开始的,正如预期的那样。

我从父进程的最后时间是〜13。这是因为p.join()等待子进程完成。如果我将其删除,则在父级上打印的时间约为10。

脚本:

from time import sleep
import time
from multiprocessing import Process

### function ###
def func(l):

     for i in l:
         sleep(1)
         print (i)
         t1 = time.time()
         total = t1-t0
         print ('time : ',total)


### main code ###
t0 = time.time()
l = list(range(1, 4))

if __name__ == '__main__':
     p = Process(target=func, args=(l,))
     p.start()
     # p.join()

sleep(10)
print ('done')
t1 = time.time()
total = t1-t0
print ('time : ',total)

输出:

$ python testmultiproc.py 
1
time :  1.0065689086914062
2
time :  2.0073459148406982
3
time :  3.0085067749023438
done
time :  10.008337020874023