当前位置: 首页 > 面试题库 >

运行多个异步函数并获取每个函数的返回值

范承教
2023-03-14
问题内容

我试图创建一个可以异步运行多个进程并发送响应的函数。由于multiprocessing.Process()不返回响应,因此我想创建一个函数为:

from multiprocessing import Process

def async_call(func_list):
    """
    Runs the list of function asynchronously.

    :param func_list: Expects list of lists to be of format
        [[func1, args1, kwargs1], [func2, args2, kwargs2], ...]
    :return: List of output of the functions
        [output1, output2, ...]
    """
    response_list = []
    def worker(function, f_args, f_kwargs, response_list):
        """
        Runs the function and appends the output to list
        """
        response = function(*f_args, **f_kwargs)
        response_list.append(response)

    processes = [Process(target=worker, args=(func, args, kwargs, response_list)) \
                    for func, args, kwargs in func_list]

    for process in processes:
        process.start()
    for process in processes:
        process.join()
    return response_list

在此函数中,我worker异步调用,它接受的其他参数list。由于列表是作为参考传递的,所以我认为我可以在列表中附加实际功能的响应。和async_call将返回我所有的功能的响应。

但这并不符合我的预期。值会附加到list中的worker(),但工作人员response_list列表外部仍为空。

知道我在做什么错吗?而且,有没有其他选择可以实现我的目标?


问题答案:

您不能直接在流程之间共享对象。您需要使用为传递值而专门设计的类之一,即Queue和Pipe;请参阅文档。



 类似资料:
  • 问题内容: 在我的NodeJS代码中,我需要进行2或3个API调用,每个调用都会返回一些数据。在完成所有API调用之后,我想将所有数据收集到单个JSON对象中以发送到前端。 我知道如何使用API​​回调(下一个调用将在上一个调用的回调中发生)执行此操作,但这会很慢: 我知道您也可以通过promise做一些类似的事情,但我认为相同的概念适用于下一个调用要等到当前调用完成后才能执行的情况。 有没有一种

  • 我试图写一个异步函数,使多个读取,等待所有完成,然后返回JSON结果作为一个数组。这是我到目前为止所拥有的: 文件1。js 应用程序编程接口。js util.js 当执行在调试器处暂停时,我使用Chrome的开发工具检查,它正确地是由3个对象组成的数组,但如果我检查,它奇怪地在控制台中返回一个

  • 更新 我已经读了十几篇关于这个话题的文章,但没有一篇涉及到这个基本问题。我将在本文末尾列出一个参考资料部分。 原始帖子 我对函数的理解是,它返回一个promise。 MDN文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function 在我的程序中,我可以编写如下内容: 我

  • 问题 你希望构造一个可以返回多个值的函数 解决方案 为了能返回多个值,函数直接return一个元组就行了。例如: >>> def myfun(): ... return 1, 2, 3 ... >>> a, b, c = myfun() >>> a 1 >>> b 2 >>> c 3 讨论 尽管myfun()看上去返回了多个值,实际上是先创建了一个元组然后返回的。 这个语法看上去比较奇怪,实际上我

  • 问题内容: 是否可以获取从调用范围返回函数的行号? 例: 我认为这是不可能的,因为它应该已经从堆栈中删除了,但是也许它仍然被缓存在某个地方? 用例是我有一个HTTP处理程序,我想记录返回错误的行和文件名,而不必乱扔代码。 问题答案: AFAIK,不可能自动获取执行最后一次返回的行。 但是,有了一个小帮手,您可以拥有: 操场 输出:

  • 问题内容: 如何从异步函数返回值?我试图喜欢这个 它给了我, 问题答案: 您不能超出范围。为了获得预期的结果,您应该将其包装到异步IIFE中,即 样品。 有关更多信息 由于返回一个Promise,因此可以将其省略,如下所示: 然后像以前一样做