如何从 python 中的多处理中获取函数输出?

Posted

技术标签:

【中文标题】如何从 python 中的多处理中获取函数输出?【英文标题】:How i get function outputs from multiprocessing in python? 【发布时间】:2022-01-12 13:47:53 【问题描述】:

我有两个函数,需要返回值才能继续执行脚本的其他部分……但目前我的代码只给出第一个函数的输出……

import multiprocessing
def gm(name):
    h = "Good Morning"+str(name)
    qout.put(h)
def sal(name):
    k="Hi "+str(name)
    qout.put(k)
if __name__ == '__main__':
    qout = multiprocessing.Queue()
    p1 = multiprocessing.Process(target=gm, args=("ashin",))
    p2 = multiprocessing.Process(target=sal, args=("ashin",))
    p1.start()
    p2.start()
    p1.join()
    p2.join()
result = qout.get()

#output - “早安阿欣”

#required 输出 - “Good Morning ashin”和“Hi ashin”

感谢您的帮助......

【问题讨论】:

好吧,您需要进行一些重构:您需要将 que 作为参数添加到处理调用中,然后您需要在每个函数的开头调用 gue.get,如“计算”之后" 使用 put 来填充 que。最后,主要你需要读出 que 试试result = []; while not qout.empty():; result.append(qout.get()) 【参考方案1】:

qout.get() 从队列中获取第一个元素。我不知道您要实现的目标的大局,但您可以从队列中获取所有元素,如下所示。

from multiprocessing import Process, Queue

def gm(name):
    h = "Good Morning"+str(name)
    qout.put(h)

def sal(name):
    k="Hi "+str(name)
    qout.put(k)

if __name__ == '__main__':
    qout = Queue()
    p1 = Process(target=gm, args=("ashin",))
    p2 = Process(target=sal, args=("ashin",))
    p1.start()
    p2.start()
    p1.join()
    p2.join()

    list1 = []
    while not qout.empty():
        list1.append(qout.get())
    temp = list(map(str, list1))
print(" & ".join(temp))

输出

Hi ashin & Good Morningashin

【讨论】:

现在它的工作......我感谢大家帮助我..我对 qout.get() 中的顺序也有一点疑问,就像它的顺序一样每个进程完成的作业或按给定的进程顺序完成的作业,如 p1、p2 ...如果它是按完成顺序完成的,那么我也想知道我们是否可以按照进程的顺序对结果列表进行排序,如 list1 = [ p1,p2]....因为我需要将值分配给不同的变量,并且不要错过分配的值......?@B.Kocis @Timus @Vijayendar Guururaja @Ashin,在多线程或多处理期间,执行或完成的顺序完全取决于python解释器的内部实现。您不应该依赖多处理,因为它不能保证预期的结果顺序。 没错.....但是我有另一种方法来处理这个问题。通过在 qout.put("1", output1) 中添加优先级密钥......谢谢@Ramachandran拉贾塞卡兰【参考方案2】:

不用自己管理输出队列,只需使用最新的 Python 3 并发特性:

from concurrent.futures import as_completed, ProcessPoolExecutor

def gm(name):
    return f'Good Morning name'

def sal(name):
    return f'Hi name'

if __name__ == '__main__':
    with ProcessPoolExecutor() as exe:
        futures = [exe.submit(x, 'ashin') for x in (gm, sal)]
    for future in as_completed(futures):
        print(future.result())

【讨论】:

很高兴知道...谢谢@Velimir Mlaker

以上是关于如何从 python 中的多处理中获取函数输出?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 中的多处理期间访问全局变量 [重复]

Selenium 中的多线程/多处理

Python中的多处理:处理多个工作线程

如何获取python的多处理数组'指针并将其传递给Cpp程序?

带指针的多处理和 ctypes

SQL:如何从 sql 中的函数输出中获取子字符串?