簡體   English   中英

在Python多處理中的池進程之間傳遞消息

[英]Pass messages between pool processes in Python multiprocessing

我是python多重處理的新手。 我正在編寫一個redis pubsub模塊,其中發布者從數據庫表中讀取數據並在通道上發布數據。 在訂戶端,我打算創建一些工作進程,這些工作進程可以通過訂閱該頻道來偵聽該頻道,從該頻道獲取項目並對其執行一些操作。 當任何進程從通道獲取END字符串時,我想停止所有池進程。 為此,我使用multiprocessing.Manager().Queue()在池進程之間進行通信。 我的訂戶模塊如下:

import redis
import time
import traceback
import json
import multiprocessing as mp
import contextlib

NO_OF_PROCESS = 4

def newProcess(queue):
    r = redis.StrictRedis()
    p = r.pubsub()
    p.subscribe('subChannel')

    while True:
        print ('Waiting...')
        if (queue.get() == 'END'):
            break 
        # Do some work from message
        message = p.get_message()
        print (message)
        if message:
            data = message['data']
            # If 'END' received than stop all pool processes by setting a message in shared queue
            if data == b'END':
                queue.put('END')
                break
            else:
                data = json.loads(data)
                print (data)
       time.sleep(1)


class Worker:
    def __init__(self, NO_OF_PROCESS):
        self.NO_OF_PROCESS = NO_OF_PROCESS
        self.queue = mp.Manager().Queue()
        self.pool = mp.Pool(processes = NO_OF_PROCESS)

    def doWork(self):
        [self.pool.apply(newProcess, args=(self.queue)) for i in range(self.NO_OF_PROCESS)]



def parallelExec():
    worker = Worker(NO_OF_PROCESS)
    worker.doWork()

parallelExec()

這里的問題是我嘗試執行時遇到以下錯誤TypeError: newProcess() argument after * must be an iterable, not AutoProxy[Queue] 請幫忙,如果還有其他方法,我想聽聽。

您不是以可迭代的方式發送args,通過添加逗號將args轉換為元組應該可以解決此問題

        [self.pool.apply(newProcess, args=(self.queue,)) for i in range(self.NO_OF_PROCESS)]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM