一、实验目的
1. 掌握多进程程序设计
2. 掌握多线程程序设计
二、实验环境
1.操作系统:Windows
2.主要软件:Jupyter notebook
三、实验内容
1. 运行下面程序,理解使用进程池实现多进程的思路。
from multiprocessing import Pool
import os
import time
def run(n):
print(f"正在运行的进程ID:{os.getpid()};")
time.sleep(2)
return n**2
if __name__ == '__main__':
# 进程池没满就新创建进程执行请求,否则就等待
# 注意,这里指定进程池数量为3,会一直是这三个进程在执行,只不过执行的请求可能改变
pool = Pool(3)
res_list = []
for i in range(10):
print("order:",i)
res = pool.apply_async(run, args=(i,))
res_list.append(res)
pool.close()
pool.join()
for res in res_list:
print(res.get())
2. 【多进程】已知下面的程序是计算1~100000之间所有素数和的程序,已实现了单进程计算,但多进程计算暂未实现,请完成use_multi_process()函数的编写,使得整个程序运行正确,并观察开启2个进程和开启4个进程两种方法的运行时间差异。
import multiprocessing
import time
def isPrime(n): #判断一个数字是否为素数
if n <= 1:
return False
for i in range(2,int(n)):
if n % i == 0:
return False
return True
def get_prime(beg,end): #得到某个区间所有素数的和
p=[]
for i in range(beg,end):
if isPrime(i):
p.append(i)
return sum(p)
def no_multi_process():
prime_sum = get_prime(1,100001)
return(prime_sum)
def use_multi_process(count):
#请完成这个函数
if __name__ == '__main__':
print("-----------------------------------------------")
start = time.time()
print("单进程,1~100000之间所有素数和:", no_multi_process())
end = time.time()
t=end-start
print("单进程运行时间: ",t)
print("-----------------------------------------------")
start = time.time()
#print("2个进程,1~100000之间所有素数和:", use_multi_process(2))
end = time.time()
t=end-start
print("多进程运行时间: ",t)
print("-----------------------------------------------")
start = time.time()
#print("4个进程,1~100000之间所有素数和:", use_multi_process(4))
end = time.time()
t=end-start
print("多进程运行时间: ",t)
print("-----------------------------------------------")
3. 运行下面程序,并理解以下多线程实现的思路
import threading
import time
"""重新定义带返回值的线程类"""
class MyThread(threading.Thread):
def __init__(self,func,args=()):
super(MyThread,self).__init__()
self.func = func
self.args = args
def run(self):
self.result = self.func(*self.args)
def get_result(self):
try:
return self.result
except Exception:
return None
"""测试函数,计算两个数之和"""
if __name__ == '__main__':
def fun(a,b):
time.sleep(1)
return a+b
li = [] #用于存放线程对象的列表
for i in range(4):
t = MyThread(fun,args=(i,i+1))
li.append(t)
t.start()
for t in li:
t.join() # 一定要join,不然主线程比子线程跑的快,会拿不到结果
print (t.get_result())
4. 【多线程】已知下面的程序是计算1~100000之间所有素数和的程序,已实现了单线程计算,但多线程计算暂未实现,请完成use_multi_threading()函数
import threading
import time
"""重新定义带返回值的线程类"""
class MyThread(threading.Thread):
def __init__(self,func,args=()):
super(MyThread,self).__init__()
self.func = func
self.args = args
def run(self):
self.result = self.func(*self.args)
def get_result(self):
try:
return self.result
except Exception:
return None
def isPrime(n): #判断一个数字是否为素数
if n <= 1:
return False
for i in range(2,int(n)):
if n % i == 0:
return False
return True
def get_prime(beg,end): #得到某个区间所有素数的和
p=[]
for i in range(beg,end):
if isPrime(i):
p.append(i)
return sum(p)
def no_multi_threading():
prime_sum = get_prime(1,100001)
return(prime_sum)
def use_multi_threading(count):
#请完成这个函数
if __name__ == '__main__':
print("-----------------------------------------------")
start = time.time()
print("单线程,1~100000之间所有素数和:", no_multi_threading())
end = time.time()
t=end-start
print("单线程运行时间: ",t)
print("-----------------------------------------------")
start = time.time()
print("2个线程,1~100000之间所有素数和:", use_multi_threading(2))
end = time.time()
t=end-start
print("多进程运行时间: ",t)
print("-----------------------------------------------")
start = time.time()
print("4个线程,1~100000之间所有素数和:", use_multi_threading(4))
end = time.time()
t=end-start
print("多进程运行时间: ",t)
print("-----------------------------------------------")