我想添加n个自然数,但将其划分为不同的线程。我已经实现了。但是,我在最终获得总和时遇到了问题。请帮助使用同步,使用全局变量和锁定机制。
我使用过线程。让我们假设我要添加30个自然数,并分成三个线程,每个线程求和10个自然数,我得到的答案是每个线程的总和,我想得到30的总和。
我正在使用Python 2.7
我的代码:
import threading
a=input("Enter first number")
b=input("Enter second number")
sum=0
def add_func(a,b):
result=0
for i in range(a, b+1):
result =result + i
print result
if __name__ == "__main__":
t1 = threading.Thread(target=add_func(1, 10))
t2 = threading.Thread(target=add_func(11, 20))
t3 = threading.Thread(target=add_func(21, 30))
t1.start()
t2.start()
t3.start()
输出:
Enter first number1
Enter second number30
55
155
255
答案 0 :(得分:0)
即使没有GIL(如果您使用的是CPython),此问题的线程版本也将比math慢,因此我假设这纯粹是出于教学目的。
Python中的线程主要用于IO绑定而不是CPU绑定的工作(但请查看multiprocessing模块以了解CPU绑定的工作)。
您可以通过多种方式从线程返回结果。一种方法是传递结果列表,并为每个线程分配一个唯一的ID号,该ID号可用于索引该列表。线程完成任务后,将其存储在结果列表中,所有线程重新加入后,调用代码中都可以使用该列表。
另一种方法可能是使用共享变量或lock来强制对共享数据进行互斥(如果GIL尚未这样做……),但是在这种情况下,这感觉有些过头了。
代码如下:
from threading import Thread
from math import ceil
def add_func(i, res, start, end):
total = 0
for n in range(start, end):
total += n
res[i] = total
if __name__ == "__main__":
a = 67
b = 131
num_threads = 4
threads = []
res = [None] * num_threads
step = ceil((b - a) / num_threads)
for i in range(num_threads):
t = Thread(
target=add_func,
args=(i, res, a, min(b, a + step) + 1)
)
threads.append(t)
t.start()
a += step + 1
for thread in threads:
thread.join()
print(sum(res))
或者这是解决此特定问题的快速方法:
a = 67
b = 130
print((abs(a - b) + 1) * (a + b) / 2)