如何对函数进行异步调用,从而进一步通过回调进行异步调用?

时间:2019-07-22 18:57:45

标签: python python-2.7 asynchronous multiprocessing

我正在尝试转换现有的同步代码库以支持对循环中多个项目的异步函数调用。 在内部,有一个Long任务被调用,需要10分钟来处理。

我已经遍历了很多链接并研究了一些现有方法。 我可以使用python多重处理(apply_async,池),但我认为这不能完全解决问题。 另外,我使用的是python 2.7,因此无法使用最新的asyncio / await功能。

我在process.py中尝试过:

pool = Pool(processes=4)
results = pool.map(launchTask, b, c)

但是,这符合我的要求,但不好。 因为我将不得不更改actualRunTask(...)才能正确打印结果,而我却被允许更改它。

在我的示例中,有3个组成部分- 1.我需要像这样的循环中处理输入列表(对象) process.py

    def process(aList, b, c):
        for a in aList:
            x = createObj(a, b, c)     # Creates object of class Launcher
            x.launchTask()
  1. launcher.py
 class Launcher:

    def launchTask(a, b, c):


        ...some preprocessing...

        ret = ""
        while ret == "" or ret == "INIT" or ret == "PEND":
            ret = actualRunTask(b, c)
            sleep(5)
            print (ret)

        print "#########FINISHED########"
  1. actualTask​​.py
    class ActualTask:
           self._map = dict()

        def actualRunTask(b, c):
            registerCallBackFromC++(self)

            tag = "index"

            if tag in _map:
                if self._map[tag] is None:
                    return "PEND"
                else:
                    if len(self._map[tag].Errors) == 0:
                         return "DONE"
                    else:
                         return "ERROR"

            LongTaskSwigCallToC++Async(args)           # Takes 10 minutes

            self._map[tag] = None

            return "INIT"

当前:

  1. launchTask(...)在while循环和阻塞中。因此,在完成之前的操作之前,无法处理for循环中aList中的所有项目。
  2. 第一次调用
  3. actualRunTask(...)->返回INIT。 但是,在随后的调用中,它将返回PEND。 稍后,最后,当回调设置对象属性时,它将返回DONE或ERROR。 因此,LongTaskSwigCallToC ++ Async(...)仅被调用一次。

预期:

  1. 可以为所有aList项目执行launchTask(...),而无需等待每个项目完成。
  2. 可以同时删除while循环阻塞。

0 个答案:

没有答案