python - 从多线程python中的列表中选择项目
问题描述
我是 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)
但是在多线程环境中,每个线程都给我相同的值,即使我希望每个线程的值都不同(例如删除线程已经使用的值)我在这里有什么选择?
解决方案
如果我理解正确,您想使用一个线程(生产者)用值填充列表,然后从同一个列表中删除几个不同的线程(消费者)。因此产生了一系列消费者,这些消费者具有生产者添加的值的互斥子集。
一个可能的结果可能是:
制片人
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)
同样重要的是,生产者和消费者都可以访问相同的 of 实例q
。
推荐阅读
- amazon-web-services - 超出最大调用堆栈大小 - aws-cdk
- c++ - 使用 Opengl CORE 函数和 Comptability profile - GLFW
- nginx - 如何使用 kubernetes 入口处理错误 503
- laravel - 为什么这个 Eloquent 查询没有得到预期的结果?
- flutter - Flutter DropdownButtonFormField.onChanged 不更新 UI
- django - Django 错误,CSRF 失败:CSRF 令牌丢失或不正确
- ruby-on-rails - 仅在条件下保存对象
- python - 如何遍历 itertools.product() 的结果?
- android - 从屏幕截图中获取像素颜色
- javascript - 反应中的多个参考