首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从多线程python中的列表中选择项

从多线程python中的列表中选择项
EN

Stack Overflow用户
提问于 2018-07-02 13:02:22
回答 1查看 739关注 0票数 0

我是python的初学者,不知道如何做到这一点:我正在运行一个python脚本,它每5-10秒将一个新值放入列表中。我想从另一个多线程python脚本中的列表中选择这些元素,但是每个线程都有一个值,所以不应该重用一个值,如果没有下一个值,那么等待下一个值出现。我有一些代码试图做,但没有成功:

创建值的脚本:

代码语言:javascript
复制
values = ['a','b','c','d','e','f']
cap = []

while True:
    cap.append(random.choice(values))
    print cap
    time.sleep(5)

需要这些值的脚本:

代码语言:javascript
复制
def adding(self):

p = cap.pop()
print (p)

然而,在多线程环境中,每个线程都给出了相同的值,即使我希望每个线程的值是不同的(例如删除线程已经使用的值),这里我的选项是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-09 17:11:57

如果我正确理解,您希望使用一个线程(一个生产者)填充一个列表中的值,然后使用几个不同的线程(使用者)从该列表中删除。因此,产生了一系列具有相互排斥子集的生产者所加值的消费者。

可能的结果可能是:

生产者

代码语言:javascript
复制
cap.append('a')
cap.append('c')
cap.append('b')
cap.append('f')

消费者1

代码语言:javascript
复制
cap.pop() # a
cap.pop() # f

消费者2

代码语言:javascript
复制
cap.pop() # c
cap.pop() # b

如果这是您想要的行为,我建议使用线程安全对象,比如队列 (python2.*)或队列 (python3.*)。

这里有一个可能的实现

生产者

代码语言:javascript
复制
import Queue
values = ['a','b','c','d','e','f']
q = Queue.Queue()

while True:
    q.put(random.choice(values))
    print q
    time.sleep(5)

Consumer

代码语言:javascript
复制
val = q.get() # this call will block (aka wait) for something to be available
print(val)

同样重要的是,生产者和消费者都可以访问q的同一个实例。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51136890

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档