如何安排一对不同的功能,以便真正并行运行?
Posted
技术标签:
【中文标题】如何安排一对不同的功能,以便真正并行运行?【英文标题】:How to arrange a pair of different functions so as to indeed be run in parallel? 【发布时间】:2019-11-17 02:07:08 【问题描述】:我想并行执行两个函数,并想验证它们是否并行运行。在这里我并行运行 2 个函数,但我得到的输出不同。理想情况下,它们应该同时完成
我使用的是 Windows 10 操作系统,因此无法使用 Ray。甚至不能使用 pool 因为我使用的功能会不同
代码:
import datetime
from multiprocessing import Process
import os
import datetime
def info(title):
print(title)
print('module name:', __name__)
print('parent process:', os.getppid())
print('process id:', os.getpid())
def f(name):
info('function f')
print('hello', name)
def func1():
for i in range(1):
print('function 1 running')
for j in range(10000):
for k in range(10000):
a=1
print(datetime.datetime.now())
return
def func2():
for i in range(1):
print('function 2 running')
for j in range(10000):
for k in range(10000):
a=1
print(datetime.datetime.now())
return
if __name__ == '__main__':
info('main line')
p1 = Process(target=func1())
p1.start()
p2 = Process(target=func2())
p2.start()
输出:
main line
module name: __main__
parent process: 17284
process id: 2372
function 1 running
2019-07-07 12:00:44.512577
function 2 running
2019-07-07 12:00:50.100357
预期输出:
function 1 running
function 2 running
2019-07-07 12:00:44.512577
2019-07-07 12:00:44.512577
【问题讨论】:
这是一个很常见的错误:Process(target=func1())
这个首先调用func1()
,在主线程上执行,然后用target=None
启动一个新进程(所以什么都不做)。将其更改为Process(target=func1)
。您希望将函数 func1
传递为 target
,而不是其结果。不幸的是,如果大多数 IDE 看到你正在编写一个函数,它们总是会自动完成 ()
,所以如果你不小心很容易犯这个错误
我也试过了,但它不执行修改后的代码:p1 = Process(target=func1) p1.start() p2 = Process(target=func2) p2.start() 输出得到:主线模块名称:_main_ 父进程:17284 进程ID:2372 似乎没有运行
【参考方案1】:
你写的
p1 = Process(target=func1())
p1.start()
p2 = Process(target=func2())
p2.start()
在当前进程中(按顺序)评估这两个函数,
并将None
结果作为target
参数传递。
你想要执行
p1 = Process(target=func1)
...
p2 = Process(target=func2)
在不评估可调用对象的情况下传递可调用对象。
【讨论】:
我也试过了,但它不执行修改后的代码:p1 = Process(target=func1) p1.start() p2 = Process(target=func2) p2.start() 我得到的输出:主线模块名称:_main_ 父进程:17284 进程 ID:2372 似乎没有运行以上是关于如何安排一对不同的功能,以便真正并行运行?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 3 个不同浏览器中的同一台电脑上并行运行 selenium html 套件?