什么是多进程?
简单的理解:单板上运行的一个程序就是一个进程。进程是操作系统分配资源的最小单位,不同的进程之间资源不共享,进程间通信需要使用特定的方式。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()