import time import multiprocessing from multiprocessing import Manager def sum_range(start, end, result): total = 0 for i in range(start, end): total += i result.append(total) if __name__ == '__main__': start_time = time.time() manager = Manager() result = manager.list() t1 = multiprocessing.Process(target=sum_range,args=(1, 50000001, result)) t2 = multiprocessing.Process(target=sum_range, args=(50000001, 100000001, result)) t1.start() t2.start() t1.join() t2.join() total = sum(result) end_time = time.time() print("并行总和为:", total) print("并行用时:", end_time - start_time, "秒") start_time = time.time() result = [] sum_range(1,100000001,result) end_time = time.time() print("串行总和为:", result[0]) print("串行用时:", end_time - start_time, "秒")
时间: 2023-11-12 14:06:03 浏览: 98
这是一个使用 Python 的 multiprocessing 模块实现并行计算的例子,其中定义了一个函数 sum_range(start, end, result),用于计算从 start 到 end 的整数之和,并将结果存储在 result 中。在主程序中,使用了 multiprocessing.Manager() 方法创建了一个共享内存的列表对象 result,然后启动了两个进程分别计算前半部分和后半部分的整数之和,并将结果存储在 result 中。最后,使用 sum() 函数计算并行计算的结果,并输出并行计算和串行计算的总和和用时。
需要注意的是,由于使用了共享内存对象,因此在多进程中对 result 的操作需要进行同步,否则可能会出现竞争条件和数据不一致的问题。在这个例子中,由于使用了 multiprocessing.Manager() 方法创建的共享内存对象,因此可以直接使用 append() 方法将计算结果添加到 result 中,而无需进行额外的同步操作。
相关问题
import time from multiprocessing import Process from multiprocessing import Manager def sum_range(start, end): total = 0 for i in range(start, end): total += i return total class MyProcess(Process): def __init__(self,st, end, result): self.st = st self.end = end self.result = result super().__init__() def run(self) -> None: total = 0 for i in range(self.st, self.end): total += i self.result.append(total) if __name__ == '__main__': start_time = time.time() manager = Manager() result = manager.list() t1 = MyProcess(1, 50000001,result) t2 = MyProcess(50000001,100000001,result) t1.start() t2.start() t1.join() t2.join() total = sum(result) end_time = time.time() print("并行总和为:", total) print("并行用时:", end_time - start_time, "秒") start_time = time.time() total = sum_range(1,100000001) end_time = time.time() print("串行总和为:", total) print("串行用时:", end_time - start_time, "秒")
这段代码使用了 Python 的 multiprocessing 模块来实现并行计算一个范围内的整数和。它首先定义了一个 sum_range 函数,该函数接受两个参数 start 和 end,然后使用一个 for 循环计算这个范围内所有整数的和,并返回结果。然后它定义了一个名为 MyProcess 的子类,该类继承自 multiprocessing.Process 类,它重写了 run 方法来计算给定范围内的整数和,并将结果存储在一个共享列表中。在主函数中,它使用 multiprocessing.Manager 类来创建共享列表,然后启动两个 MyProcess 实例来并行计算整数和。最后,它计算并打印串行和并行计算的总和和用时。
帮我重写如下代码from multiprocessing import Process,Queue from threading import Thread import time import os #先进先出 def def_a(): q=Queue(10) q.put("5") q.put("A") print(q.get()) def task(a): res=0 for i in range(10): res=res+1 if name=='main': def_a() r=4 a=os.cpu_count() print(a) start=time.time() dd=[] for i in range(r): p=Process(target=task,args=(i,)) p.start() print(i) p.join()#join方法 end=time.time() print("用时1",end-start) a=os.cpu_count() print(a) start=time.time() l=[] for i in range(r): p2=Thread(target=task,args=(i,)) p2.start() print(i) l.append(p2) for ppp in l: ppp.join()#join方法 #print("a"+str(i)) end=time.time() print("用时",end-start) #time.sleep(5)
重写后的代码如下:
```python
from multiprocessing import Process, Queue
from threading import Thread
import time
import os
# 先进先出
def def_a():
q = Queue(10)
q.put("5")
q.put("A")
print(q.get())
# 进程任务
def process_task(a):
res = 0
for i in range(10):
res += 1
if __name__ == '__main__':
# 调用 def_a() 函数创建一个队列
def_a()
# 获取当前 CPU 的核心数,并打印出来
cpu_count = os.cpu_count()
print("当前 CPU 核心数:", cpu_count)
# 多进程
start = time.time()
process_list = []
for i in range(cpu_count):
p = Process(target=process_task, args=(i,))
p.start()
print("进程", i, "已启动")
process_list.append(p)
for p in process_list:
p.join() # join方法,等待所有进程执行完毕
end = time.time()
print("多进程用时:", end - start)
# 多线程
start = time.time()
thread_list = []
for i in range(cpu_count):
t = Thread(target=process_task, args=(i,))
t.start()
print("线程", i, "已启动")
thread_list.append(t)
for t in thread_list:
t.join() # join方法,等待所有线程执行完毕
end = time.time()
print("多线程用时:", end - start)
```
重写后的代码中,注重以下几个方面:
1. 在代码中增加了注释,使得代码更加易读易懂。
2. 修改了函数名,使其更加符合函数的功能。
3. 在多进程和多线程的循环中,将循环次数设置为当前 CPU 核心数,以充分利用 CPU 的性能。
4. 在多进程和多线程的循环中,将进程和线程分别存储在列表中,在循环结束后分别使用 join 方法等待所有进程或线程执行完毕。
5. 在计算多进程和多线程用时时,使用了更加简洁的写法,使代码更加简洁明了。
阅读全文