实验八 并行计算

一、实验目的

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("-----------------------------------------------")  

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值