我有一些代码,我想使用队列在进程之间共享对象。我有一个父母:
processing_manager = mp.Manager()
to_cacher = processing_manager.Queue()
fetchers = get_fetchers()
fetcher_process = mp.Process(target=fetch_news, args=(to_cacher, fetchers))
fetcher_process.start()
while 1:
print(to_cacher.get())
还有一个孩子:
def fetch_news(pass_to: Queue, fetchers: List[Fetcher]):
def put_news_to_query(pass_to: Queue, fetchers: List[Fetcher]):
for fet in fetchers:
for news in fet.latest_news():
print(news)
pass_to.put(news)
print("----------------")
put_news_to_query(pass_to, fetchers)
我希望看到 N 个对象打印在put_news_to_query
中,然后是一行,然后在父项中循环中打印相同的对象。问题是,对象似乎错过了:如果我得到,比如说,在put_news_to_query
中打印 8 个对象,我只会得到 while 循环打印的 2-3 个对象。我在这里做错了什么?
这不是答案,除非答案是代码已经在工作了。我刚刚修改了代码,使其成为相同技术的运行示例。数据从子级传输到父级,而不会丢失数据。
import multiprocessing as mp
import time
import random
def worker(pass_to):
for i in range(10):
time.sleep(random.randint(0,10)/1000)
print('child', i)
pass_to.put(i)
print("---------------------")
pass_to.put(None)
def main():
manager = mp.Manager()
to_cacher = manager.Queue()
fetcher = mp.Process(target=worker, args=(to_cacher,))
fetcher.start()
while 1:
msg = to_cacher.get()
if msg is None:
break
print(msg)
if __name__ == "__main__":
main()
因此,显然,这与执行 put 和 get 语句的顺序有关。基本上,父打印中的一些对象是在行之前打印的。如果你在这样的事情上挣扎,我建议添加一些东西来区分印刷品,就像这样:
print(f"Worker: {news}")
print(f"Main: {to_cacher.get()}")