Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中调用另一个函数的函数_Python_Python 2.7_Multiprocessing - Fatal编程技术网

在python中调用另一个函数的函数

在python中调用另一个函数的函数,python,python-2.7,multiprocessing,Python,Python 2.7,Multiprocessing,我正在尝试加速Python程序,我注意到有一个线程总是在运行,它扫描来自外部资源的输入,当它得到一些东西时,它将调用另一个函数来解析输入数据并返回可理解的信息(解析函数也使用其他函数) scanning()函数的简单模型 def scanning(x): alpha = GetSomething(x) if alpha != 0: print Parsing(alpha) 所以我的想法是将这个线程转换成一个进程,这个进程将与主进程并行运行,当它得到一些东西时,它

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

scanning()
函数的简单模型

def scanning(x):
    alpha = GetSomething(x)
    if alpha != 0:
        print Parsing(alpha)
所以我的想法是将这个线程转换成一个进程,这个进程将与主进程并行运行,当它得到一些东西时,它将使用队列将它发送到主进程,然后调用解析函数

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

如果没有,需要对
扫描()
函数的结构进行哪些修改才能方便地与
多处理模块一起使用


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

简短回答:是的,这是可能的

要理解原因,您需要了解多处理的一个方面。它不会将
多处理
调用的函数删除到单独的进程中:它创建整个进程的完整副本:包括它的代码、加载的模块和在分叉进程之前已初始化的任何全局数据

因此,如果您的代码定义了一些子函数,那么在将其拆分为单独的进程后,这些子函数将与预初始化的任何数据一起对您的函数可用。分支进程之后对主进程的值、函数和名称空间的任何修改都不会影响分支进程-您需要使用特殊工具在进程之间进行通信

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

import SomeModule
define SomeFunction()
assign SomeValue

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

start ChildProcess()
decrease SomeValue
do MainProcessStuff
对于主进程和派生进程,您的代码执行相同,直到行
start ChildProcess()
。在这一行之后,您的流程分成两部分,这两部分最初完全相同,但执行点不同。主进程经过这一行,直接进入
domainprocessstuff
,而您的子进程永远不会到达这一行。相反,它创建整个名称空间的副本并开始执行ChildProcess(),就好像调用它时像调用普通函数一样,后面跟着一个
exit()

注意主进程和子进程如何访问
SomeValue
。还要注意它们对它的更改是如何独立的,因为它们是在不同的名称空间中进行的(因此对不同的
SomeValue
s)。
线程化
模块不会出现这种情况,它不会分割名称空间,这是一个重要的区别

还要注意的是,主进程从不执行
ChildProcess
中的代码,但它保留了对它的引用,可以用来跟踪它的进度、提前终止它等等


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

我想这就像您所说的:一个用于填充队列的线程,有些线程可以扫描队列中的任何内容。如果输入速度比扫描速度快,则上述选项是可行的part@Whitefret我正试图用多处理取代线程,但我想知道什么是正确的方法,因为
scanning()
中有很多函数调用,如果您能提供帮助,我将不胜感激。我不明白您为什么要使用多处理,除非您想同时使用多台机器。在这种情况下,我不知道用普通python实现这一点的方法,但您可以在C中使用MPI,在java中使用RMI,甚至为什么不使用Map/Reduce@Whitefret扫描线程总是在运行,所以我想从多处理中获益,这样它就可以在一个独立的内核上运行,与主程序不同如果我们以
扫描
进程为例,它将是最初运行它的原始应用程序的新副本,因此我可以从其中调用解析函数。但是如何将解析后的数据发送回主进程?@werberbang通常用于在您使用的进程之间进行通信。在拆分进程之前创建一个管道/队列实例,为
Process
类提供对管道/队列对象的引用(通常通过将其传递给构造函数来完成),并且一旦启动子进程,两个进程都将访问管道/队列并可以从中读/写。这样,主进程是否仍然处于活动状态(执行其他操作并与用户交互)而子进程正在执行读取和解析操作,或者它将处于等待状态,直到从共享队列读取某些内容