首页 > 解决方案 > 如何安排一对不同的功能,以便真正并行运行?

问题描述

我想并行执行两个函数,并想验证它们是否并行运行。在这里我并行运行 2 个函数,但我得到的输出不同。理想情况下,它们应该同时完成

我使用的是 Windows 10 操作系统,因此无法使用 Ray。甚至不能使用池,因为我使用的功能会有所不同

代码:

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

标签: pythonpython-3.xparallel-processingmultiprocessingthreadpool

解决方案


你写了

    p1 = Process(target=func1())
    p1.start()
    p2 = Process(target=func2())
    p2.start()

它评估当前进程中的两个函数(顺序),并将None结果作为target参数传递。

相反,你想执行

    p1 = Process(target=func1)
    ...
    p2 = Process(target=func2)

它在不评估可调用对象的情况下传递可调用对象。


推荐阅读