2016-02-28 53 views
0

我一直在做一些阅读,找不到我在Python 2.7问题的最佳实践,它是这样说:添加项目列表使用线程在Python 2.7

我有一个列表的项目,我想遍历所有这些,并调用一些函数。此功能将对这些项目执行一些操作,并返回一个新项目。 函数的每个返回值都将被附加到一个新的项目列表中。 一切都很好,很简单,直到我尝试使用线程来做到这一点。

我想做同样的工作,但现在每个函数调用都会打开一个新的线程(最多20个线程),它将完成函数的工作并返回需要的信息返回到列表中。

newList = [] 

for item in myList: 
    info = getInfo(item) 
    newList.append(info) 

return newList 

从我读,列表是线程安全的,所以我想也许使用队列和线程模块,然后把当前所有物品放入队列,做这项工作的每个而经过newList和内部的每一个附加线程... 任何想法?

+0

你可以让你的函数自己完成任务。将它传递给项目,列表和索引。然后函数可以计算出该物品该做什么,一旦它确定,它就可以将该列表设置为具有正确的物品。 – zondo

回答

1

假设操作不是线程安全的,除非你毫无疑问知道它们是非常明智的。

确保任何操作的原子性的最简单方法是在执行操作之前获取锁,并且只有在执行操作时才释放它。现在with声明使得这非常简单,因为锁对象是上下文管理器。

假设你的列表是全局模块my_list那么这很容易完成,如下所示。

my_lock = threading.Lock() 
my_list = [] 
    : 
    : 
    : 
def my_list_append(o): 
    with my_lock: 
     my_list.append(o) 

还要注意的是同一个锁必须用于该列表的任何其它修饰(如弹出的项目关闭它,例如)。通过在其他线索中进行索引来简单访问元素应该不成问题。

另一种可能的方法是让线程执行操作并通过作为参数传递给线程的Queue.queue对象将项目附加到列表中。这假定只有该线程将任何东西附加到列表中。由于锁定解决方案非常简单,除非必须,否则我不会考虑这一点。

相关问题