zoukankan      html  css  js  c++  java
  • python3 并发编程

    多进程

    macname@MacdeMacBook-Pro Desktop % 
    macname@MacdeMacBook-Pro Desktop % 
    macname@MacdeMacBook-Pro Desktop % python3 test.py
    main
    test 0
    test 0
    test 1
    test 1
    test 2
    test 2
    test 3
    test 3
    test 4
    test 4
    test 5
    test 5
    test 6
    test 6
    test 7
    test 7
    test 8
    test 8
    test 9
    test 9
    macname@MacdeMacBook-Pro Desktop % cat test.py 
    import multiprocessing
    from multiprocessing import Pool
    import time
    def test1():
        for i in range(10):
            time.sleep(1)
            print('test', i)
     
    def test2():
        for i in range(10):
            time.sleep(1)
            print('test', i)
     
    if __name__ == '__main__':
        p1 = multiprocessing.Process(target=test1)
        p2 = multiprocessing.Process(target=test2)
        p1.start()
        p2.start()
        print("main")%                                                                                                                                                                              
    macname@MacdeMacBook-Pro Desktop % 
    
    
    
    
    macname@MacdeMBP Desktop % 
    macname@MacdeMBP Desktop % cat test.py
    
    import time
    from multiprocessing import Process
    
    
    def func(name, sec):
        print(name, 123)
        time.sleep(sec)
        print(name, "123end")
    
    if __name__ == '__main__':
        p1 = Process(target=func, args=("进程1", 1))
        p2 = Process(target=func, args=("进程2", 2))
        p3 = Process(target=func, args=("进程3", 3))
        p1.daemon = True  # 必须在start()之前设置守护进程
        p1.start()
        p2.start()
        p3.start()
        time.sleep(0.5)
        print("主进程结束,主进程还得等待其他子进程(非守护进程)结束才行")
    
    macname@MacdeMBP Desktop % python3 test.py
    进程1 123
    进程2 123
    进程3 123
    主进程结束,主进程还得等待其他子进程(非守护进程)结束才行
    进程2 123end
    进程3 123end
    macname@MacdeMBP Desktop % 

    多线程

    如果你的主线程在退出的时候,不用等待那些子线程完成,那就设置这些线程的daemon属性。即,在线程开始(thread.start())之前,调用setDeamon()函数,设定线程的daemon标志。(thread.setDaemon(True))就表示这个线程“不重要”。
    如果你想等待子线程完成再退出,那就什么都不用做。,或者显示地调用thread.setDaemon(False),设置daemon的值为false。新的子线程会继承父线程的daemon标志。整个Python会在所有的非守护线程退出后才会结束,即进程中没有非守护线程存在的时候才结束。
    
    
    macname@MacdeMacBook-Pro Desktop % cat test.py 
    import time
    import threading
    
    
    def fun():
        print("start fun")
        time.sleep(2)
        print("end fun")
    
    
    print("main thread")
    t1 = threading.Thread(target=fun,args=())
    #t1.setDaemon(True)
    t1.start()
    time.sleep(1)
    print("main thread end")
    macname@MacdeMacBook-Pro Desktop % 
    macname@MacdeMacBook-Pro Desktop % 
    macname@MacdeMacBook-Pro Desktop % python3 test.py
    main thread
    start fun
    main thread end
    end fun
    macname@MacdeMacBook-Pro Desktop % 
    
    
    
    
    
    
    macname@MacdeMacBook-Pro Desktop % cat test.py 
    import time
    import threading
    
    def fun():
        print("start fun")
        time.sleep(2)
        print("end fun")
     
     
    print("main thread")
    t1 = threading.Thread(target=fun,args=())
    t1.setDaemon(True)
    t1.start()
    time.sleep(1)
    print("main thread end")%                                                                                                                                                                       
    macname@MacdeMacBook-Pro Desktop % 
    macname@MacdeMacBook-Pro Desktop % python3 test.py
    main thread
    start fun
    main thread end
    macname@MacdeMacBook-Pro Desktop % 
    macname@MacdeMacBook-Pro Desktop % 

    协程

    # Greenlet对象创建
    job = Greenlet(target0, 3)
    Greenlet.spawn() # 创建一个协程并启动
    Greenlet.spawn_later(seconds=3) # 延时启动
     
    # 协程启动
    job.start() # 将协程加入循环并启动协程
    job.start_later(3) # 延时启动
     
    # 等待任务完成
    job.join() # 等待任务完成
    job.get() # 获取协程返回的值
     
    # 任务中断和判断任务状态
    job.dead() # 判断协程是否死亡
    job.kill() # 杀死正在运行的协程并唤醒其他的协程,这个协程将不会再执行,可以
    job.ready() # 任务完成返回一个真值
    job.successful() # 任务成功完成返回真值,否则抛出错误
     
    # 获取属性
    job.loop # 时间循环对象
    job.value # 获取返回的值
     
    # 捕捉异常
    job.exception # 如果运行有错误,获取它
    job.exc_info # 错误的详细信息
     
    # 设置回调函数
    job.rawlink(back) # 普通回调,将job对象作为回调函数的参数
    job.unlink() # 删除回调函数
    # 执行成功的回调函数
    job.link_value(back)
    # 执行失败的回调函数
    job.link_exception(back)
    
    
    
    macname@MacdeMacBook-Pro Desktop % 
    macname@MacdeMacBook-Pro Desktop % cat test.py 
    from gevent import monkey
    monkey.patch_all()  # 记住一定放在第一行,这里是打补丁的意思,time模块在使用协程gevent模块的时候,必须打补丁才行,记得放在第一行。
    import gevent
    import time
     
     
    def eat(name):
        print(f"{name} eat first")
        time.sleep(3)
        print(f"{name} eat second")
     
     
    def play(name):
        print(f"{name} play phone 1")
        time.sleep(2)
        print(f"{name} play phone 2")
     
     
    g1 = gevent.spawn(eat, "lily")
    g2 = gevent.spawn(play, name="lily")
    g1.join()
    g2.join()%                                                                                                                                                                                      
    macname@MacdeMacBook-Pro Desktop % 
    macname@MacdeMacBook-Pro Desktop % python3 test.py
    lily eat first
    lily play phone 1
    lily play phone 2
    lily eat second
    macname@MacdeMacBook-Pro Desktop % 

  • 相关阅读:
    连载《一个程序猿的生命周期》-《发展篇》- 34.如果自己有想法去“创业”,怎么平衡与工作之间的关系
    连载《一个程序猿的生命周期》-《发展篇》- 33.是不是又走在“创业”的路上?!
    连载《一个程序猿的生命周期》-《发展篇》- 32.疫情中复工,跌宕起伏的2019,发展元年的2020
    连载《一个程序猿的生命周期》-《发展篇》- 28.恰逢五四,我们又走在奋斗的路上吗?
    连载《一个程序猿的生命周期》-《发展篇》- 27.从来没有996过,仍然需要人生的选择权
    连载《一个程序猿的生命周期》-《发展篇》- 26.且听风吟,静待花开,慢慢走向人生赢家
    连载《一个程序猿的生命周期》-《发展篇》- 25.论一个非正式项目经理的自我修养
    连载《一个程序猿的生命周期》-《发展篇》- 24.你所掌握的技术,创造的价值会越来越低
    连载《一个程序猿的生命周期》-《发展篇》- 23.两年多的时间,从孤家寡人到10多人的团体,经历了什么
    6年前端开发被实习生替代,所谓“经验”一文不值!
  • 原文地址:https://www.cnblogs.com/sea-stream/p/14071224.html
Copyright © 2011-2022 走看看