【发布时间】:2017-02-05 12:49:30
【问题描述】:
我有如下代码:
server.py
import queue
from multiprocessing.managers import BaseManager
class QueueManager(BaseManager):
pass
q = queue.Queue()
QueueManager.register('queue', callable=lambda:q)
m = QueueManager(address=('localhost', 51000), authkey=b'pass')
s = m.get_server()
s.serve_forever()
生产者.py
from multiprocessing.managers import BaseManager
import time
class QueueManager(BaseManager):
pass
QueueManager.register('queue')
m = QueueManager(address=('localhost', 51000), authkey=b'pass')
m.connect()
queue = m.queue()
idx = 0
while True:
time.sleep(2)
queue.put(idx)
idx += 1
consumer.py
from multiprocessing.managers import BaseManager
class QueueManager(BaseManager):
pass
QueueManager.register('queue')
m = QueueManager(address=('localhost', 51000), authkey=b'pass')
m.connect()
queue = m.queue()
while True:
message = queue.get()
print(message)
如果我运行服务器和生产者,然后启动消费者,我会看到生产者放入队列的所有消息都出现在消费者身上。但是,如果我停止消费者并立即重新启动它,它总是会跳过一条消息。
为了说明我看到的 consumer.py 的输出:
0
1
2
3
<restart the consumer>
5
6
7
etc.
这正是 python 多处理队列应该如何工作的方式,是错误还是我做错了什么?
【问题讨论】:
-
如何重启消费者?
-
我只是用 Ctrl+C 杀死它并重新启动它
-
当生产者将整数放入队列时,您正在杀死消费者,那么您希望它如何打印上一个项目?
-
如果我在生产者将下一个整数放入队列之前杀死消费者,也会发生这种情况。我希望这个整数只保留在队列中,直到有消费者使用它,但是似乎杀死消费者会影响队列。
-
@Semi:我用你的代码又玩了大约 1 个小时,但无法让它工作,请参阅下面的更新答案,我会将其归档为错误
标签: python python-3.x queue multiprocessing