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

我可以从multiprocessing.Process获取返回值吗?

黄扬
2023-03-14
问题内容

我已经使用Python多处理模块在Monte Carlo代码中实现了一些简单的并行性。我有看起来像的代码:

montecarlos = [MonteCarlo(f,fargs) for fargs in farglist]
jobs = [multiprocessing.Process(mc) for mc in montecarlos]
for job in jobs: job.start()
for job in jobs: job.join()
results = [mc.results for mc in montecarlos]

但是,当我查看结果列表时,似乎蒙特卡洛迭代器尚未启动。我知道它们有,因为我可以让这些过程在蒙特卡洛步骤中打印出信息。所以我在做些愚蠢的事情。我以为job.join()会阻止结果列表被构建,直到一切运行完毕,因此mc.results字段将被更新。

我意识到我还没有告诉您我的Monte Carlo例程的详细信息,希望这没有关系,而且我犯的错误是在我对多处理功能的解释中。在此先感谢您提供的任何帮助。


问题答案:

这些MonteCarlo对象已被腌制并发送到子进程中以进行运行-.results此进程中的属性未填充,因为mc从未运行过本地。

如果创建了multiprocessing.Queue,则可以将其传递给每个MonteCarlo作业,完成后应将结果放入其中。然后,顶层可以等待队列中的值。(在引擎盖下,它将腌制和解开结果对象。)

result_queue = multiprocessing.Queue()
montecarlos = [MonteCarlo(result_queue, f,fargs) for fargs in farglist]
jobs = [multiprocessing.Process(mc) for mc in montecarlos]
for job in jobs: job.start()
for job in jobs: job.join()
results = [result_queue.get() for mc in montecarlos]


 类似资料:
  • 问题内容: 我试图从multiprocessing.Process获取一个追溯对象。不幸的是,通过管道传递异常信息不起作用,因为无法腌制回溯对象: 追溯: 还有另一种访问异常信息的方法吗?我想避免传递格式化的字符串。 问题答案: 使用您可以传递包装的异常并在以后重新引发它们: 因此,如果您在远程进程中捕获到异常,则将其包装,然后将其传递回去。调用主流程即可完成工作。

  • 问题内容: 我正在使用Microsoft SQL Server JDBC驱动程序2.0通过Java连接到SQL Server(2005)。 如何从存储过程中获取返回值?我正在做类似的事情: 我应该使用execute()吗?executeQuery()?executeUpdate()?这些似乎都不默认返回一个返回值,但是我不确定如何获取它。 编辑1:明确地说,我知道如何调用存储过程。这个问题专门关于

  • 问题内容: 我想创建一个函数来检查user_id是否已在我的数据库中。 但是,是第三方Firebase提供的API。它定义为return 。 (void)observeSingleEventOfType:(FEventType)eventType withBlock:(void(^)(FDataSnapshot * snapshot))块 错误: 感谢任何帮助。 更新 我正在尝试另一种方式: 不知

  • 问题内容: 我想获取html页面的“打印值”。 我在下面的查询中尝试过,但是showGetResult()仅返回“空值” 但是当我尝试此代码时,我的apache服务器日志已打印,我访问了index.php。 (index.php只是打印helloworld) 问题答案: 我想你想做的就是这个。

  • 问题内容: 如何通过使用和避免返回值? 例: 问题答案: 要返回可选值的值,或者返回默认值(如果可选值没有值),则可以使用。 请注意,我重写了查找最长名称的代码:您可以直接与比较器比较每个String的长度。可以通过调用键提取器作为方法引用来获得一个这样的比较器。

  • 问题内容: 以下代码给出了编译错误,提示“意外运行”: 我知道,如果正常调用函数就可以获取返回值,而无需使用goroutine。或者我可以使用频道等 我的问题是为什么不能从goroutine中获取像这样的返回值。 问题答案: 严格的答案是您 可以 做到。这可能不是一个好主意。下面的代码可以做到这一点: 这将产生一个新的goroutine,它将进行计算,然后将结果分配给。问题是:您将如何使用原始go