我将需要在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的局限性。
答案 0 :(得分:2)
您遇到的问题取决于您如何实施线程。
最重要的一个:
让我们假装:
sums
,那么每当您对任何元素进行任何类型的修改时,您基本上都会序列化所有线程,并且您将看不到任何并行性。func
非常昂贵,这是值得的。L
,因为您只能从中读取。多个线程可以安全地读取同一块内存。只有写入是危险的。所以我基本上告诉你,你需要以某种方式锁定sums
,但你不能,因为每种方法都很慢。对性能所做的是每个线程在其工作时都有自己的sums
,然后当线程完成时,将所有线程的副本组合回一个sum
。