我会遇到哪些并行化问题?

时间:2013-10-08 16:59:28

标签: python multithreading

我将需要在python中多线程化以下代码以进行作业(将其转换为伪代码)。我只是想在开始之前看看我的解决方案是否遗漏了什么。

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

我的解决方案是将语句拆分为for循环:将'item'变量保存在临时变量中,每当我执行此操作时锁定L,然后计算信息散列(temp_item)和func(temp_item)到更多临时变量。然后锁定L并更新它。

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

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

1 个答案:

答案 0 :(得分:2)

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

最重要的一个:

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

让我们假装:

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

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