• python编程中的并发------多进程multiprocessing


    任务例子:喝水、吃饭动作需要耗时1S

    单任务:(耗时20s)

    for i in range(10):

        print('a正在喝水')

        time.sleep(1)

        print('a正在吃饭')

        time.sleep(1)

    一、多进程(耗时10s)

    multiprocessing模块开启2个进程实现

    代码如下:

    import multiprocessing
    import time

    def start(fuc):
    for i in range(10):
    print('正在{}'.format(fuc))
    time.sleep(1)



    if __name__ == '__main__':
    p1 = multiprocessing.Process(target=start,args=('喝水',))
    p2 = multiprocessing.Process(target=start,args=('吃饭',))
    p1.start()
    p2.start()

    二、多进程:如何共享资源

    方案1:使用内置的消息队列Queue

    def start(fuc,q):
    for i in range(10):
    # 向队列中加入一个信息:fuc
    q.put(fuc)
    time.sleep(1)

    if __name__ == '__main__':
    # 定义一个消息队列,默认存储的队列信息为5个
    q = multiprocessing.Queue(5)
    p1 = multiprocessing.Process(target=start,args=('喝水',q))
    p2 = multiprocessing.Process(target=start,args=('吃饭',q))
    p1.start()
    p2.start()
    while True:
    # 从队列中取出一个信息(先放入的先被取出来)
    print(q.get())

    三、多进程:进程池

    当我们的任务很多时,或者任务数量不一定时,无限的创建进程会导致程序崩溃,可以固定使用几个进程来分配完成这些任务

    (比如10个新app需要研发,3个研发团队,一个个的去完成)

    def start(num):
    print('--开始执行任务{}--'.format(num))
    time.sleep(2)
    print('--结束执行任务{}--'.format(num))

    if __name__ == '__main__':
    # 定义一个进程池,至多开启2个进程
    pool = multiprocessing.Pool(2)
    # 向进程池中添加新任务
    pool.apply_async(start, args=(1,))
    pool.apply_async(start, args=(2,))
    pool.apply_async(start, args=(3,))
    pool.apply_async(start, args=(4,))
    # 关闭进程池
    pool.close()
    # 在此阻塞,等到进程池任务全部完成,子进程全部结束,再执行下面的代码
    # 如不阻塞等待,主进程如果在下面终止了,则子进程全部终止
    pool.join()
    
    

    pool.apply_async等待进程池关闭后开启同步执行子进程
    pool.apply本次添加进进程池的任务,添加的同时开始执行,结束了才开始下一次添加

    转载请注明出处!谢谢!
  • 相关阅读:
    Java生成登录随机验证码
    Java调用百度API实现人脸识别
    阿里云CentOS开放端口
    Windows环境下利用nginx作为图片服务器
    SpringCloud使用Feign调用服务,@ModelAttribute无法传递实体类参数
    Solr7正确的调用SolrClient姿势
    LeetCode 235. Lowest Common Ancestor of a Binary Search Tree(BST求最近公共祖先)
    LeetCode 538. Convert BST to Greater Tree(把BST每个节点的值都加上比它大的节点的值)
    Trie树模板例题
    Google KickStart 2020 RoundA
  • 原文地址:https://www.cnblogs.com/felix-g/p/13233246.html
Copyright © 2020-2023  润新知