gpt4 book ai didi

python - 队列跳过队列中的第一个项目 (Python multiprocessing.Queue)

转载 作者:太空宇宙 更新时间:2023-11-03 20:33:20 26 4
gpt4 key购买 nike

硬件:Raspberry Pi 4B (1GB) 和 Macbook Pro

操作系统:Raspbian 和 OSX

Python版本:3.7.3

我遇到了 multiprocessing.Queue() 跳过放置在队列中的第一个项目的问题。经过一些测试后,我发现如果我在后续的 q.put() 命令之间添加额外的代码(time.sleep(.0001)、print('')、除注释代码之外的任何代码),就可以防止这种情况发生。 q.get 将始终跳过队列中的第一个项目并开始处理第二个项目,在将项目添加到队列之间没有延迟,并且当添加延迟时,它将始终获取队列中的第一个项目。也许有人可以向我解释发生了什么以及如何以更好的方式解决这个问题。提前致谢。

这是一段示例代码,显示了我遇到的问题*(请参阅注释)。

import multiprocessing
import time

set_size = 3

def process_queueing():
entry = 1
data_list = []
for i in range(1,100):
data_list.append(i)
if i % set_size == 0:
data = [data_list, set_size, entry]
q.put(data)
#time.sleep(.001) #Uncomment to fix problem
entry = entry + 1
data_list.clear()

def process_data():
while True:
data = q.get()
for i in data[0]:
print('Entry: ' + str(data[2]) + ' Data: ' + str(i))


q = multiprocessing.Queue()
process = multiprocessing.Process(target=process_data, daemon=True)
process.start()

process_queueing()

*注意:此代码实际上显示队列中的数据不完整且不正确(Entry: 1 Data: 4 Entry: 1 Data: 5 Entry: 1 Data: 6(完整输出)而不是 Entry: 1 Data: 1 Entry: 1 Data: 2 Entry: 1 Data: 3 等等...)在此示例中以及在我的 Macbook Pro 上运行时(Python 3.7.3, OSX 10.14.5)不输出任何内容。同样,添加额外的代码作为延迟可以解决所有问题。

最佳答案

import multiprocessing
import time

set_size = 3

def process_queueing():
entry = 1
data_list = []
for i in range(1,100):
data_list.append(i)
if i % set_size == 0:
data = [list(data_list), set_size, entry]
q.put(data)
# time.sleep(.001) #Uncomment to fix problem
# print(data)
entry = entry + 1
data_list.clear()

def process_data():
while True:
data = q.get()
for i in data[0]:
print('Entry: ' + str(data[2]) + ' Data: ' + str(i))


q = multiprocessing.Queue()
process = multiprocessing.Process(target=process_data, daemon=True)
process.start()

process_queueing()

输出

Entry: 1 Data: 1
Entry: 1 Data: 2
Entry: 1 Data: 3
Entry: 2 Data: 4
Entry: 2 Data: 5
Entry: 2 Data: 6
Entry: 3 Data: 7
Entry: 3 Data: 8
Entry: 3 Data: 9
Entry: 4 Data: 10

我想我已经成功了,通过将data_list更改为list(data_list),我认为发生的情况是你覆盖了data_list而不是创建一个新列表每次。我真的认为你应该使用类似 Locks 的东西为此,避免任何像您所面临的竞争条件。

关于python - 队列跳过队列中的第一个项目 (Python multiprocessing.Queue),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57339405/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com