【问题标题】:Python multiprocessing not working when time.sleep is used使用 time.sleep 时 Python 多处理不起作用
【发布时间】:2021-09-23 06:42:00
【问题描述】:

我有一个函数可以接受不同的输入,我希望该函数并行运行。以下是我尝试过的,但由于 time.sleep 我认为它不起作用。

from multiprocessing import Process
from time import sleep
import time

def f(name):
    print('hello', name)
    time.sleep(10)

l1 = Queue()
a = Process(target=f('Tom'))
a.start()

l2 = Queue()
b = Process(target=f("Stock"))
b.start()

print (l1.get())
print (l2.get())

我希望函数并行运行。目前该函数在进入第二次执行之前等待 10 秒。

【问题讨论】:

标签: python python-3.x multithreading multiprocessing


【解决方案1】:

查看@juanpa.arrivillaga 发表的评论。只需将函数的 name 指定为 Process 构造函数的 target 参数即可;不要调用该函数。 target 的参数单独指定为 args 参数,可以是 tuple 或 list。

此外,由于f 没有返回有用的值,因此没有理由为结果使用Queue 实例。在任何情况下,您都没有将Queue 实例传递给f,也没有将put 传递给队列,所以我不明白为什么您会尝试针对这些get 发出调用Queue实例;这些电话将永远挂起。您做需要传递给f的参数是名称,如下:

from multiprocessing import Process
#from time import sleep
import time

def f(name):
    print('hello', name)
    time.sleep(10)

start_time = time.time()

a = Process(target=f, args=('Tom',))
a.start()

b = Process(target=f, args=("Stock",))
b.start()

# Wait for processes to complete
a.join()
b.join()

elapsed_time = time.time() - start_time
print(elapsed_time)

打印:

hello Tom
hello Stock
10.212252855300903

如果您在 Windows 等平台上运行它,那么您需要将创建进程的代码放在一个特殊的块中,如下所示;

from multiprocessing import Process
#from time import sleep
import time

def f(name):
    print('hello', name)
    time.sleep(10)

# Required on platforms that create processes with the "spawn" method:
if __name__ == '__main__':
    start_time = time.time()

    a = Process(target=f, args=('Tom',))
    a.start()

    b = Process(target=f, args=("Stock",))
    b.start()

    # Wait for processes to complete
    a.join()
    b.join()

    elapsed_time = time.time() - start_time
    print(elapsed_time)

【讨论】:

    【解决方案2】:

    使用Pool 和starmap:

    import multiprocessing
    import time
    
    def f(name, place):
        print('hello', name, place)
        time.sleep(5)
    
    if __name__ == '__main__':
        data = [('Louis', 'val1'), ('Paul', 'val2'), ('Alexandre', 'val3'),
                ('John', 'val4'), ('Tom', 'val5'), ('Bob', 'val6')]
        with multiprocessing.Pool(2) as pool:
            pool.starmap(f, data)
    

    仔细阅读multiprocessing guidlines

    安全导入主模块

    确保新的 Python 解释器可以安全地导入主模块,而不会导致意外的副作用(例如启动新进程)。

    【讨论】:

    • 我认为最重要的是,__main__ 是最重要的部分。
    • @PeterWood 感谢您的回复。假设函数接受 2 个输入参数 def f(name , place ) 。在这种情况下,我们如何实现多处理。
    • 这个答案似乎只是避免了这个问题。问题代码中的错误是一个需要理解的重要错误。仅仅展示正确完成后不同方法的外观似乎并不能涵盖这一点。
    • @MisterMiyagi。我不回避这个问题。问题是我希望函数并行运行。。我的解决方案不回答这个问题吗?
    • @MeenakshisundaramRamanathan。我更新了我的问题并将map 替换为starmap。我用元组列表替换names。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-05
    • 1970-01-01
    • 2014-11-13
    • 2013-02-20
    • 1970-01-01
    • 2018-10-26
    • 2020-12-26
    相关资源
    最近更新 更多