• 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()
  • 相关阅读:
    Django(69)最好用的过滤器插件Django-filter
    Django(68)drf分页器的使用
    Django(67)drf搜索过滤和排序过滤
    SweetAlert使用
    虚拟环境之间批量pip安装包迁移
    ubuntu 18.04 安装uwsgi 和nginx
    ubuntu 18.04安装mysql及常见问题处理
    ubuntu 18.04安装virtualenv和virtualenvwrapper安装及使用
    滚动视差stellar.js
    JMeter之使用技巧
  • 原文地址:https://www.cnblogs.com/chusiyong/p/12900521.html
Copyright © 2020-2023  润新知