当前位置: 首页 > 知识库问答 >
问题:

Python多重处理apply_async读/写变量在主进程启动子进程

范兴文
2023-03-14

我使用的是Python 3.5多处理应用异步。我的代码类似于task=pool。应用异步(myFunc,args)。我在args中传递一个信息(来自信息的对象)。它有一个名为startTime的数据成员。我希望当myFunc开始运行时,info。开始时间将被写入时间。时间()。问题是主流程中的信息和子流程中的信息不一样<代码>信息。开始时间=时间。myFunc中的time()不会更改主进程中的信息。有没有一个好办法来挽救startTime?谢谢

共有1个答案

伊光赫
2023-03-14

池中的进程不能写入公共变量。把它们想象成存在于平行宇宙中。你需要一些机制来在他们之间共享信息。下面是一个使用Manager来保持所有进程的时间戳的简单示例

from multiprocessing import Pool, Manager, current_process
import time

def do_work(x, ll):
    time.sleep(.2)
    ll.append(current_process().name + ' took task '+str(x)+' at '+str(time.time()))

if __name__ == '__main__':
    with Manager() as manager:
        timestamp = manager.list()
        p = Pool(processes=4)
        for x in range(10):
            p.apply_async(do_work, (x, timestamp))
        p.close()
        p.join()
        print(timestamp)

如果您更改timestamp=manager。list()只需timestamp=list(),您将看到它不再工作。

另外,当您使用池时,队列似乎不容易处理。

 类似资料:
  • 问题:我有一个类似DAG(有向无环图)的结构,用于在机器上开始执行一些海量数据处理。某些流程只能在其父级数据处理完成时启动,因为存在多级处理。我想首先使用python多处理库在一台机器上处理它的所有内容,然后使用管理器在不同的机器上扩展执行。我以前没有python多处理的经验。有人能建议这是一个好的图书馆吗?如果是,一些基本的实现想法就可以了。如果不是,在python中还有什么可以用来做这件事?

  • 问题内容: 我正在学习如何使用Python多处理库。但是,当我浏览一些示例时,最终我在后台运行了许多python进程。 其中的例子看起来象下面这样: 现在,这是我的“ TOP”命令的屏幕截图: 我不知道如何一口气杀死他们。 ps … | grep python ....杀死吗? 我需要添加哪种python代码,以避免再次发生这种悲惨的情况。谢谢! 问题答案: 您需要在工作队列中处理您的进程,该进程

  • 问题内容: 我想产生长时间运行的子进程,这些子进程在主进程重新启动/死亡时仍然存在。从终端运行时,这工作正常: 请注意,父进程被杀死后,子进程仍处于活动状态。但是,如果我像这样从systemd启动主进程… …然后当我杀死主要过程时,孩子也死了: 我怎样才能使孩子生存呢? 在CentOS Linux版本7.1.1503(Core)下运行go版本go1.4.2 linux / amd64。 问题答案:

  • 我有3个单独运行的Spring Boot-Camel应用程序。我需要链接这些进程,例如在进程A完成后,它应该启动进程B,然后一旦进程B完成,它应该继续进程C。如果中间有任何进程失败,进程链应该重试失败的进程,并继续执行到下一个。此外,在进程A中,如果路由中的任何步骤有任何失败,那么我也需要重试并从中间步骤开始。有人能帮我实现这个场景吗?

  • 问题内容: 我想并行化我的Python程序,以便它可以在运行它的机器上使用多个处理器。我的并行化非常简单,程序的所有并行“线程”都是独立的,并将其输出写入单独的文件。我不需要线程交换信息,但是必须知道线程何时完成,因为管道的某些步骤取决于它们的输出。 可移植性很重要,因为我希望它可以在Mac,Linux和Windows上的任何Python版本上运行。考虑到这些限制,哪个是实现此功能的最合适的Pyt

  • 问题内容: 注意 我已经看到了multiprocessing.Process的日志输出-不幸的是,它没有回答这个问题。 我正在通过多重处理创建一个子进程(在Windows上)。我希望 所有 子进程的stdout和stderr输出都重定向到日志文件,而不是出现在控制台上。我看到的唯一建议是让子进程将sys.stdout设置为文件。但是,由于Windows上stdout重定向的行为,这不能有效地重定向