继续在多处理池中添加任务以供池读取

时间:2018-09-11 17:01:35

标签: python threadpool python-multiprocessing pool

我的应用程序的一部分正在产生很多任务(本质上是字典)。每个任务(词典)本质上都是到第三方API的POST数据。

因此,我想对这些任务的执行进行多处理。

我当时想:创建一个多进程池,该池将从队列中读取任务,并将其发送到函数(FN),该函数随后将调用API。

问题是:我希望我应该能够继续在队列中推送由池连续读取的任务。但是,这没有发生。在更新队列(将任务推入队列)时,未调用函数(FN)。下面是代码:

from multiprocessing import Pool, Queue, cpu_count, Manager


class PoolThread:
    running = False

    def __init__(self, a):
        self.initialisepool()

    @staticmethod
    def poolfunction(arg):
        print(arg)
        print(arg.qsize())
        return "processed"
        #return arg * arg

    def callb(self, a):
        print(a)

    def errcall(self, b):
        print(b)

    def initialisepool(self):
        print(cpu_count())
        self.p = Pool(cpu_count())
        self.m = Manager()
        self.q = self.m.Queue()
        self.p.map_async(self.poolfunction, (self.q,), cpu_count(), self.callb, self.errcall)

    def readcache(self):
        if not self.running:
            self.running = True
            self.threadedhandling()

    def threadedhandling(self):
        tasks = self.gettasks()
        # Push to queue
        self.q.put(tasks)


    def gettasks(self):
        dict_r = {'randomval' : 2}
        return dict_r


pt = PoolThread()
pt.readcache()

在上面,池被初始化。但是,在调用readcache()时,不会重新调用poolfunction。如果队列中填充了self.p.map_async(self.poolfunction, (self.q,), cpu_count(), self.callb, self.errcall)之前的数据,则仅调用poolfunction。

我的要求是:

  • 我应该继续推入队列,并自动监视队列以调用poolfunction。
    • 如何监视poolfunction的结果?池函数一次只能从传递给API的队列中获取一个参数。一旦获得响应,我想读取单个响应并在单独的功能中进行进一步处理。但是,正如我所了解到的那样,一旦每个进程完成,就会同时返回所有正在运行的进程的结果。这是真的?为了解决这个问题,我使用“ chunksize”选项,以便即使我在队列中有20个任务,但只有8个核心,然后一次要处理8个任务并返回其响应。但是,是否可以在任务完成时不断获得响应?

0 个答案:

没有答案