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")
            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")
            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()
posted @ 2020-05-16 14:53  Yong_无止境  阅读(447)  评论(0编辑  收藏  举报