我有一个程序,它每分钟调用一个API并做一些操作,当满足某些条件时,我想创建一个新的进程,它将每秒钟调用另一个API并做一些操作。父进程不关心这个子进程产生的结果,子进程将独自运行,直到一切都完成。通过这种方式,父进程可以继续每分钟调用api,并在不中断的情况下执行操作。
我研究了多处理。然而,我无法让它在main之外工作。我尝试传递一个回调函数,但这产生了意外的结果(父进程在某个时刻再次并行运行(。
我能想到的另一个解决方案是创建另一个项目,然后提出请求。然而,我会有很多重复的代码。
解决我问题的最佳方法是什么?
示例代码:
class Main:
[...]
foo = Foo()
child = Child()
foo.Run(child.Process)
class Foo:
[...]
def Run(callbackfunction):
while(True):
x = self.dataServices.GetDataApi()
if(x == 1020):
callbackfunction()
#start next loop after a minute
class Child:
[...]
def Compute(self):
while(True):
self.dataServics.GetDataApiTwo()
#do stuff
#start next loop after a second
def Process(self):
self.Compute() # i want this function to run from a new process, so it wont interfer
第2版:在多进程尝试中添加
class Main:
def CreateNewProcess(self, callBack):
if __name__ == '__main__':
p = Process(target=callBack)
p.start()
p.join()
foo = Foo()
child = Child(CreateNewProcess)
foo.Run(child.Process)
class Foo:
def Run(callbackfunction):
while(True):
x = dataServices.GetDataApi()
if(x == 1020):
callbackfunction()
#start next loop after a minute
class Child:
_CreateNewProcess = None
def __init__(self, CreateNewProcess):
self._CreateNewProcess = CreateNewProcess
def Compute(self, CreateNewProcess):
while(True):
dataServics.GetDataApiTwo()
#do stuff
#start next loop after a second
def Process(self):
self.CreateNewProcess(self.Compute) # i want this function to run from a new process, so it wont interfer
我不得不重新组织一些事情。其中:
-
防护
if __name__ == '__main__':
应包括对象,尤其是对函数和方法的调用。通常情况下放在代码末尾的全局级别上。 -
不应在主进程中创建子对象。理论上你可以执行此操作可以将它们用作子级所需数据的容器处理,然后将它们作为参数发送,但我认为如果认为有必要,则应使用类。在这里我用了一个简单的CCD_ 2参数,该参数可以是任何可拾取的参数。
-
在全球层面上拥有一个作为过程的功能是更清洁的目标(在我看来(
最后看起来像:
from multiprocessing import Process
class Main:
@staticmethod
def CreateNewProcess(data):
p = Process(target=run_child, args=(data,))
p.start()
p.join()
class Foo:
def Run(self, callbackfunction):
while(True):
x = dataServices.GetDataApi()
if(x == 1020):
callbackfunction(data)
#start next loop after a minute
class Child:
def __init__(self, data):
self._data = data
def Compute(self):
while(True):
dataServics.GetDataApiTwo()
#do stuff
#start next loop after a second
# Target for new process. It is cleaner to have a function outside of a
# class for this
def run_child(data): # "data" represents one or more parameters from
# parent to child necessary to run specific child.
# "data" must be pickleable.
# Can be omitted if unnecessary
global child
child = Child(data)
child.Compute()
if __name__ == '__main__':
foo = Foo()
foo.Run(Main.CreateNewProcess)