我是python的初学者,无法弄清楚该怎么做: 我正在运行一个python脚本,该脚本每5-10秒将一个新值放入列表中。我想从另一个多线程python脚本的列表中选择这些元素,但是每个线程一个值,因此不应重复使用一个值,如果没有下一个值,请等待下一个值出现。我有一些尝试执行的代码,但没有成功:
创建值的脚本:
values = ['a','b','c','d','e','f']
cap = []
while True:
cap.append(random.choice(values))
print cap
time.sleep(5)
需要这些值的脚本:
def adding(self):
p = cap.pop()
print (p)
但是在多线程环境中,每个线程都给我相同的值,甚至以为我希望每个线程的值都不同(例如,删除线程已使用的值)在这里我有什么选择?
答案 0 :(得分:1)
如果我理解正确,您想使用一个线程(生产者)用值填充列表,然后使用几个不同的线程(消费者)从同一列表中删除。因此,产生了一系列消费者,这些消费者具有生产者添加的值的互斥子集。
可能的结果可能是:
制作人
cap.append('a')
cap.append('c')
cap.append('b')
cap.append('f')
消费者1
cap.pop() # a
cap.pop() # f
消费者2
cap.pop() # c
cap.pop() # b
如果这是您想要的行为,我建议您使用线程安全对象,例如Queue(python 2. *)或queue(python 3。*)
这是一种可能的实现方式
制作人
import Queue
values = ['a','b','c','d','e','f']
q = Queue.Queue()
while True:
q.put(random.choice(values))
print q
time.sleep(5)
消费者
val = q.get() # this call will block (aka wait) for something to be available
print(val)
生产者和消费者都可以访问q
的同一实例,这一点也很重要。