zoukankan      html  css  js  c++  java
  • python多进程之multiprocessing

    什么是多进程?

    简单的理解:单板上运行的一个程序就是一个进程。进程是操作系统分配资源的最小单位,不同的进程之间资源不共享,进程间通信需要使用特定的方式。python提供了自带的multiprocessing库,用于多线程场景。

    线程的创建(函数式和对象式)

    import multiprocessing
    import time
    
    def worker(interval):
        while True:
            print("The time is {0}".format(time.ctime()))
            time.sleep(interval)
    
    if __name__ == "__main__":
        p = multiprocessing.Process(target = worker, args = (1,))
        p.start()
        p.join()
    import multiprocessing
    import time
    
    class ClockProcess(multiprocessing.Process):
        def __init__(self, interval):
            multiprocessing.Process.__init__(self)
            self.interval = interval
    
        def run(self):
            while True:
                print("the time is {0}".format(time.ctime()))
                time.sleep(self.interval)
    
    if __name__ == '__main__':
        p = ClockProcess(1)
        p.start()
        p.join()

    守护进程

    如果将一个进程设置为守护进程,那么当主进程结束时,守护进程也自动结束。

    import multiprocessing
    import time
    
    class ClockProcess(multiprocessing.Process):
        def __init__(self, interval):
            multiprocessing.Process.__init__(self)
            self.interval = interval
    
        def run(self):
            while True:
                print("the time is {0}".format(time.ctime()))
                time.sleep(self.interval)
    
    if __name__ == '__main__':
        p = ClockProcess(1)
        p.daemon = True # 设置子进程为守护进程后,看不到子进程的任何打印
        p.start()
        print("main process end")

    如果想主进程等待子进程结束后,使用join即可

    进程间通信

    互斥锁

    import multiprocessing
    
    def one_task(lock, f):
        with lock: # 技巧:使用with后自动获取锁和自动释放锁
            fs = open(f, 'a+')
            n = 10
            while n > 1:
                fs.write("one_task write
    ")
                n -= 1
            fs.close()
    
    def two_task(lock, f):
        lock.acquire()
        try:
            fs = open(f, 'a+')
            n = 10
            while n > 1:
                fs.write("two task write
    ")
                n -= 1
            fs.close()
        finally:
            lock.release()
    
    if __name__ == "__main__":
        lock = multiprocessing.Lock()
        f = "file.txt"
        one = multiprocessing.Process(target = one_task, args = (lock, f))
        two = multiprocessing.Process(target = two_task, args = (lock, f))
        one.start()
        two.start()
        one.join()
        two.join()

    消息队列

    import multiprocessing
    import time
    
    def writer_proc(q):
        while True:
            q.put("message")
            time.sleep(1)
    
    def reader_proc(q):
        while True:
            print(q.get())
    
    if __name__ == "__main__":
        q = multiprocessing.Queue()
        writer = multiprocessing.Process(target = writer_proc, args = (q,))
        writer.start()
    
        reader = multiprocessing.Process(target = reader_proc, args = (q,))
        reader.start()
    
        reader.join()
        writer.join()
  • 相关阅读:
    RUP十大要素的应用
    使用ASP.NET 3.5 Extensions管理浏览器历史:使用服务器端
    Autodesk云计算系列视频 开篇介绍 Up to the cloud 直上云端
    AIMS 2012 不能登录的问题
    Autodesk Infrastructure Modeler (原Galileo伽利略项目)已经正式发布
    MapGuide开发中使用Fusion Viewer及通过程序开关图层
    MapGuide OpenSource 2.2 安装中的数字签名错误
    MapGuide / Map 3D 开发常用资料链接
    基于MapGuide的在线WebGIS站点再介绍
    Autodesk云计算系列视频 云计算与Civil 3D
  • 原文地址:https://www.cnblogs.com/chusiyong/p/12900521.html
Copyright © 2011-2022 走看看