我是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]
。请帮忙,如果我想听的话还有其他方法。
答案 0 :(得分:2)
您不是以可迭代的方式发送args,通过添加逗号将args转换为元组应该可以解决问题
[self.pool.apply(newProcess, args=(self.queue,)) for i in range(self.NO_OF_PROCESS)]