4

我将需要在python中对以下代码进行多线程作业(将其转换为伪代码)。我只是想在开始之前看看我的解决方案是否缺少任何东西。

L = [2, 3, 4, ...]
sums = [0, 0, 0, ...]
for item in L:
     sums[hash(item)] += func(item)

我的解决方案是在for循环中拆分语句:将'item'变量保存在临时变量中,每当我这样做时锁定L,然后将信息hash(temp_item)和func(temp_item)计算为更多临时变量. 然后锁定L并更新它。

这是最好的解决方案吗?仅在我接受或更新时锁定变量。

这更多地是关于正确学习并行性,而不是 python 的限制。

4

1 回答 1

2

您将遇到的问题取决于您如何实现线程。

大的那个:

  • 由于全局解释器锁 (GIL),Python 不会像您期望的那样执行线程。每次修改任何 Python 对象时都必须获取此锁。因此Python 线程不能使您的代码更快,因为所有线程实际上都由 GIL 序列化。它们只对 I/O 或 GUI 绘图等有用。如果您想要线程以提高性能,请查看多处理,这是相关但不同的东西。

不过,让我们假装:

  • 如果您在任何时候对任何元素进行任何类型的修改时都锁定,sums那么您实际上将序列化所有线程并且您将看不到任何并行性。
  • 在循环内做一个锁意味着锁本身可能比计算更昂贵。您可能看不到并行代码有什么收获。这只有在func非常昂贵的情况下才值得。
  • 您不需要锁定L,因为您只读取它。多个线程可以安全地读取同一块内存。只有写是危险的。

所以我基本上告诉你,你需要以sums某种方式锁定,但你不能,因为每种方法都很慢。为提高性能所做的是让每个线程在工作时都有自己sums的,然后当线程完成时,您将所有线程的副本组合回单个sum.

于 2013-10-08T17:08:38.847 回答