文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Python中的多进程怎么创建

2023-07-02 10:58

关注

这篇“Python中的多进程怎么创建”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python中的多进程怎么创建”文章吧。

1.创建进程

创建进程和创建线程的方法基本一致,请看下面代码:

# coding:utf-8# 导入多进程的包,并重命名为mpimport multiprocessing as mp# 主要工作def p1():    print("zxy")if __name__ == "__main__":    # 创建新进程    new_process = mp.Process(target=p1, name="p1")    # 启动这个进程    new_process.start()    # 阻塞该进程    new_process.join()

控制台效果图:

Python中的多进程怎么创建

2.多进程中的Queue

为什么要在多进程中使用queue呢?
因为多进程和多线程一样,在工作函数中,无法通过return返回进程函数中的结果,所以使用queue进行存储结果,要用的时候再进行取出。

# coding:utf-8import timeimport multiprocessing as mp"""    使用多进程时,运行程序所用的时间"""def job1(q):    res = 0    for i in range(100):        res += i + i**5 +i**8        time.sleep(0.1)    # 将结果放入队列中    q.put(res)def job2(q):    res = 0    for i in range(100):        res += i + i**5 +i**8        time.sleep(0.1)    q.put(res)if __name__ == "__main__":    start_time = time.time()    # 创建队列    q = mp.Queue()    # 创建进程1    process1 = mp.Process(target=job1, args=(q,))    # 创建进程2    process2 = mp.Process(target=job2, args=(q,))    process1.start()    process2.start()    # 通过队列获取值    res1 = q.get()    res2 = q.get()    print("res1为%d,res2为%d" % (res1, res2))    end_time = time.time()    print("整个过程所用时间为%s" %(end_time-start_time))

效果图:

Python中的多进程怎么创建

3.多进程与多线程的性能比较

接下来使用多进程、多线程、以及什么都不用的普通方法进行处理,看看他们三种方法的效率如何?

# coding:utf-8import multiprocessing as mpimport timeimport threading as th"""    多进程、多线程、普通方法的性能比较"""# 多进程工作def mp_job(res):    for i in range(10000000):        res += i**5 + i**6    print(res)# 多线程工作def mt_job(res):    for i in range(10000000):        res += i**5 + i**6    print(res)# 普通方法工作def normal_job(res):    for i in range(10000000):        res += i ** 5 + i ** 6    print(res)if __name__ == "__main__":    mp_sum = 0    mp_start = time.time()    process1 =mp.Process(target=mp_job, args=(mp_sum, ))    process2 = mp.Process(target=mp_job, args=(mp_sum,))    process1.start()    process2.start()    process1.join()    process2.join()    mp_end = time.time()    print("多进程使用时间为", (mp_end-mp_start))    mt_start = time.time()    mt_sum = 0    thread1 = th.Thread(target=mt_job, args=(mt_sum, ))    thread2 = th.Thread(target=mt_job, args=(mt_sum, ))    thread1.start()    thread2.start()    thread1.join()    thread2.join()    mt_end = time.time()    print("多线程使用的时间是", (mt_end-mt_start))    normal_start = time.time()    normal_sum = 0    # 进行两次    normal_job(normal_sum)    normal_job(normal_sum)    normal_end = time.time()    print("普通方法使用的时间是", (normal_end-normal_start))

效果图:

Python中的多进程怎么创建

实验结果表明:多进程的效率确实高!!!

4.进程池pool

进程池是干什么用的呢?
进程池就是python的多进程提供的一个池子,将所有的进程都放在这个池子里面,让计算机自己去使用进程池中的资源,从而多进程处理一些程序,进而提高工作效率。

(1)默认使用进程池中全部进程时

# coding:utf-8import timeimport multiprocessing as mp"""    进程池pool的使用"""def job(num):    time.sleep(1)    return num * numif __name__ == "__main__":    start_time = time.time()    # 括号里面不加参数时,默认使用进程池中所有进程    pool = mp.Pool()    res = pool.map(job, range(10))    print(res)    end_time = time.time()    print("运行时间为", (end_time-start_time))

效果图:

Python中的多进程怎么创建

(2)指定进程池中进程数时

# coding:utf-8import timeimport multiprocessing as mp"""    进程池pool的使用"""def job(num):    time.sleep(1)    return num * numif __name__ == "__main__":    start_time = time.time()    # 括号里面加参数时,指定两个进程进行处理    pool = mp.Pool(processes=2)    res = pool.map(job, range(10))    print(res)    end_time = time.time()    print("运行时间为", (end_time-start_time))

效果图:

Python中的多进程怎么创建

(3)不使用多进程时

# coding:utf-8import timedef job(res):    for i in range(10):        res.append(i*i)        time.sleep(1)if __name__ == "__main__":    start_time = time.time()    res = []    job(res)    print(res)    end_time =time.time()    print("不使用进程池所用时间为", (end_time-start_time))

效果图:

Python中的多进程怎么创建

实验结论:多进程处理事情,效率很高!!!核心越多,处理越快!

5.共享内存

一个核心,我们多线程处理时,可以使用全局变量来共享数据。但是多进程之间是不行的,那我们多进程之间应该如何共享数据呢?
那就得用到共享内存了!

# coding:utf-8import multiprocessing as mp"""    共享内存"""if __name__ == "__main__":    # 第一个参数是数据类型的代码,i代表整数类型    # 第二个参数是共享数据的值    v = mp.Value("i", 0)

6.进程锁lock

进程锁和线程锁的用法基本一致。进程锁的诞生是为了避免多进程之间抢占共享数据,进而造成多进程之间混乱修改共享内存的局面。

(1)不加锁之前

# coding:utf-8import multiprocessing as mpimport time"""    进程中的锁lock"""def job(v, num):    for i in range(10):        v.value += num        print(v.value)        time.sleep(0.2)if __name__ == "__main__":    # 多进程中的共享内存    v = mp.Value("i", 0)    # 进程1让共享变量每次加1    process1 = mp.Process(target=job, args=(v, 1))    # 进程2让共享变量每次加3    process2 = mp.Process(target=job, args=(v, 3))    process1.start()    process2.start()

效果图:

Python中的多进程怎么创建

(2)加锁之后

# coding:utf-8import multiprocessing as mpimport time"""    进程中的锁lock"""def job(v, num, l):    # 加锁    l.acquire()    for i in range(10):        v.value += num        print(v.value)        time.sleep(0.2)    # 解锁    l.release()if __name__ == "__main__":    # 创建进程锁    l = mp.Lock()    # 多进程中的共享内存    v = mp.Value("i", 0)    process1 = mp.Process(target=job, args=(v, 1, l))    process2 = mp.Process(target=job, args=(v, 3, l))    process1.start()    process2.start()

效果图:

Python中的多进程怎么创建

以上就是关于“Python中的多进程怎么创建”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯