【问题标题】:Adding items to a list using threads in Python 2.7在 Python 2.7 中使用线程将项目添加到列表中
【发布时间】:2016-02-28 15:01:02
【问题描述】:

我一直在做一些阅读,在 Python 2.7 中找不到解决我的问题的最佳实践,它是这样的:

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

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

newList = []

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

return newList

根据我的阅读,列表是线程安全的,所以我想也许可以使用队列和线程模块,然后将所有当前项目放入队列中,在传递 newList 并附加到每个线程中的同时完成每个工作...... 有什么想法吗?

【问题讨论】:

  • 你可以让你的函数自己做任务。将项目、列表和索引传递给它。然后,该函数可以确定如何处理该项目,一旦做出决定,它就可以将列表设置为具有正确的项目。

标签: python multithreading list python-2.7 thread-safety


【解决方案1】:

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

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

假设您的列表是模块全局my_list,那么这很容易实现如下。

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

还要注意,对于列表的任何其他修改(例如从列表中弹出一个项目)都必须​​使用相同的锁。通过在其他线程中建立索引来简单地访问元素应该不是问题。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-24
    • 1970-01-01
    • 2018-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    相关资源
    最近更新 更多