如何安排一对不同的功能,以便真正并行运行?

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 似乎没有运行

以上是关于如何安排一对不同的功能,以便真正并行运行?的主要内容,如果未能解决你的问题,请参考以下文章

如何在并行 Scala 中运行不同的函数

如何使用 rowwise 进行并行处理

使用 Spark 并行运行不同的分类器/算法

如何在 3 个不同浏览器中的同一台电脑上并行运行 selenium html 套件?

如何在基于 C# 的 Windows 服务中处理以不同时间间隔并行运行的多个任务?

如何轻松地在不同平台上运行Spring Cloud微服务,通过示例演示云原生应用程序的真正威力