zoukankan      html  css  js  c++  java
  • 【Python】Python多进程练习

    1,进程启动

    通过Process方法启动,通过下面的代码执行结果,可以发现,开启的进程与WHILE循环语句会同时进行。

    为什么呢?因为都是启动了进程在运行程序。

    from time import sleep
    from multiprocessing  import Process
    
    def catSound():
        while True:
            print("喵~~")
            sleep(1)
    
    
    if __name__ == '__main__':
        createProcess = Process(target=catSound)
        createProcess.start()
        while True:
            print("吱吱~")
            sleep(1.2)

    2,传递参数

    通过kwargs方法,传递参数,注意key值需要与函数中的位置参数一致。

    from multiprocessing import Process
    
    
    def catchMouse(catName, mouseName):
        print("%s 抓到了 %s" % (catName, mouseName))
    
    
    if __name__ == '__main__':
        processCatchMouse = Process(target=catchMouse, kwargs={"catName": "Tom", "mouseName": "Jack"})
        processCatchMouse.start()

    3,进程与进程之间的关系

    from time import sleep
    from multiprocessing import Process
    import os
    
    def dogSound():
        print("我的编号是: %s" % os.getpid())
        sleep(1)
        print("汪?")
    
    if __name__=='__main__':
        print("大狗:我的编号是%s 你的是多少?" % os.getpid())
        dogSoundProcess = Process(target=dogSound)
        dogSoundProcess.start()
    # 加上join后,就会等待子进程执行完毕后再执行父进程,否则会像上面的例子一样并行执行。 dogSoundProcess.join()
    print("完毕")

    注意:一般进程之间的变量是不会共享的,但是线程会。但是有一些包,提供了进程变量共享的功能。这个后续再练习

    4,进程池

    使用multiprocessing.pool中的Pool作为池子

    通过apply_async方法把进程加入池子中,但是调用join方法前,需要先调用close方法。

    import os
    import time
    from multiprocessing.pool import Pool
    import random
    
    
    def childProcess(process_number):
        print("进程编号:%d, 当前进程ID: %d" % (process_number, os.getpid()))
        startTime = time.time()
        time.sleep(random.randrange(5, 10, 2))
        endTime = time.time()
        print("进程编号:%d, 结束进程ID: %d 睡眠时间: %s" % (process_number, os.getpid(),(endTime-startTime)))
    
    
    if __name__ == '__main__':
        print("父进程id: %s" % os.getpid())
    
        processPool = Pool(3)
    
        for i in range(9):
            processPool.apply_async(func=childProcess, args=(i,))
    
        processPool.close()
        processPool.join()
    
        print("父进程结束: %d " % (os.getpid()))

    5,子进程使用队列向父进程发送消息

    from multiprocessing import Process
    from multiprocessing import Queue
    from time import sleep
    import random
    
    def smallDog(queue, number):
        print("Dog %d sound 汪!" % number)
    #向队列中传入数据信息 queue.put(
    "Dog %d have rest" % number) if __name__ == '__main__': queue = Queue() for i in range(10):
         # 创建和启动进程,并把新建的队列传入函数中。 processDog
    = Process(target=smallDog, args=(queue, i)) processDog.start()
    # 进程同步 processDog.join()
    while 1: if not queue.empty():
    # 获取数据信息
    print(queue.get()) sleep(1) else: print("没有狗了") sleep(1) break

    本人对join

  • 相关阅读:
    【Alpha】技术规格说明书
    【Alpha】第十次Scrum meeting
    【Alpha】第九次Scrum meeting
    【Alpha】第八次Scrum meeting
    【Alpha】第七次Scrum meeting
    【Alpha】特殊情况通知
    S2X环境搭建与示例运行
    [2018福大至诚软工助教]结对作业1测试结果
    机器学习
    机器学习
  • 原文地址:https://www.cnblogs.com/stanmao/p/10822975.html
Copyright © 2011-2022 走看看