【问题标题】:multiprocess a function that calls another function in python多进程一个在python中调用另一个函数的函数
【发布时间】:2016-04-05 11:43:47
【问题描述】:

我正在尝试加速一个 Python 程序,我说有一个线程总是在运行,它扫描来自外部资源的输入,当它得到一些东西时,它会调用另一个函数来解析输入数据和返回一个可以理解的信息(解析函数也使用其他函数)。

scanning() 函数的简单模型

def scanning(x):
    alpha = GetSomething(x)
    if alpha != 0:
        print Parsing(alpha)

所以我的想法是把这个线程转换成一个与主进程并行运行的进程,当它得到一些东西时,它会使用一个队列将它发送到主进程,然后主进程应该调用解析函数。

我的问题是:是否可以保持scanning()函数原样并在进程中使用它(即使它调用其他函数)?

如果不是,为了方便与multiprocessing 模块一起使用,需要对scanning() 函数的结构进行哪些修改?

在 Python 中多处理调用其他函数的函数的正确方法是什么?

【问题讨论】:

  • 我猜这就像你说的:一个线程填充队列,一些线程扫描队列中的任何内容
  • 如果输入比扫描部分更快,则上述选项是可行的
  • @Whitefret 我正在尝试用多处理替换线程,但我想知道这样做的正确方法是什么,因为scanning() 中有很多函数调用,如果可以的话,我将不胜感激帮助
  • 我不明白你为什么要使用多处理,除非你想同时使用多台机器。在那种情况下,我不知道在普通 python 中这样做的方法,但是你可以在 C 中使用 MPI,在 java 中使用 RMI,甚至为什么不使用 Map/Reduce
  • @Whitefret 扫描线程一直在运行,所以我想从多处理中获利,这样它就可以在与主程序不同的单独内核上运行

标签: python python-2.7 multiprocessing


【解决方案1】:

简短回答:是的,有可能。

要了解原因,您需要了解关于多处理的一件事。它不会将multiprocessing-invoked 函数移除到一个单独的进程中:它会创建您的整个进程的完整副本:包括它的代码、加载的模块以及之前已初始化的任何全局数据 你分叉了你的进程。

因此,如果您的代码定义了一些子函数,它们将在您的函数被拆分为一个单独的进程后与任何已预初始化的数据一起提供给您的函数。对主进程的值、函数和命名空间的任何修改派生进程之后都不会影响派生进程 - 您需要使用特殊工具在进程之间进行通信。

所以,假设您有以下抽象代码:

import SomeModule
define SomeFunction()
assign SomeValue

define ChildProcess():
    call SomeFunction()
    increase SomeValue
    do ChildProcessStuff

start ChildProcess()
decrease SomeValue
do MainProcessStuff

对于主进程和衍生进程,您的代码执行相同,直到行 start ChildProcess()。在此行之后,您的流程分为两个起初完全相同,但执行点不同。主进程越过这条线并直接进入do MainProcessStuff,而您的子进程永远不会到达那条线。相反,它会创建整个命名空间的副本并开始执行 ChildProcess(),就好像它像普通函数一样被调用,后跟 exit()

注意主进程和子进程如何访问SomeValue。还要注意它们对它的更改是如何独立的,因为它们是在不同的命名空间中进行的(因此对不同的SomeValues)。 threading 模块不会拆分命名空间,这是一个重要的区别。

另外请注意,主进程从不执行ChildProcess 中的代码,但它保留了对它的引用,可用于跟踪其进度、提前终止等。

您可能还对有关 Python 线程和进程的更深入信息感兴趣here

【讨论】:

  • 如果我们以scanning 进程为例,它将是最初运行它的原始应用程序的新副本,因此我可以从其中调用解析函数.但是我如何将解析后的数据发送回主进程?
  • @werberbang 通常,在您使用pipes and/or queues 的进程之间进行通信。在拆分进程之前创建一个管道/队列实例,为Process 类提供对管道/队列对象的引用(通常通过将其传递给构造函数来完成),一旦您启动子进程,两个进程都可以访问管道/队列和可以从中读/写。
  • 这样,当子进程执行读取和解析操作时,主进程是否仍然处于活动状态(执行其他操作并与用户交互),还是处于等待状态直到从共享队列中读取内容
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-06
相关资源
最近更新 更多