Python 多进程 multiprocessing 基本用法
multiprocessing 是Python中管理多进程的包,本文主要介绍 multiprocessing 的基本用法。基本用法和多线程的 threading 用法相同。
multiprocessing提供了一个Process类来代表一个进程对象,这个对象可以理解为一个独立的进程,可以执行另外的事情。
进程和线程对比:
import multiprocessing, time def func1(): while True: print("------进程1------") time.sleep(2) def func2(): while True: print("------进程2------") time.sleep(2) if __name__ == '__main__': # 如果不在该判断之下执行下面多进程代码,会导致报错 # 同线程一样,如果要传递参数,使用 args=参数元组 p1 = multiprocessing.Process(target=func1) p2 = multiprocessing.Process(target=func2) p1.start() p2.start()
在Windows中,由于没有fork(Linux中创建进程的机制),在创建进程的时候会import启动该文件,而在import文件的时候又会再次运行整个文件;
如果把Process()放在 if __name__ == '__main__' 判断之外,则Process()在被import的时候也会被运行,导致无限递归创建子进程导致报错;
所以在Windows系统下,必须把Process()放在 if __name__ == '__main__' 的判断保护之下。
多进程示例2:
from multiprocessing import Process import time class TestA(Process): def run(self): while True: print('TestA-------') time.sleep(2) class TestB(Process): def run(self): while True: print('TestB-------') time.sleep(2) if __name__ == '__main__': t1 = TestA() t2 = TestB() t1.start() t2.start()
多进程示例3:
和多线程不同的是,multiprocessing 自带 队列类 Queue。
import multiprocessing import time class TestA(multiprocessing.Process): def __init__(self, queue): super().__init__() # 使用父类的__init__()方法 self.queue = queue def run(self): self.put_data() def put_data(self):
# num = int(input("输入数字个数:")) # 会报错 for i in range(1, 101): self.queue.put(i) class TestB(multiprocessing.Process): def __init__(self, queue): super().__init__() self.queue = queue def get_data(self): while True: try: proc = multiprocessing.current_process() # 获取当前进程对象 print(f"--进程-{proc.name}-取出---{self.queue.get(timeout=2)}---") time.sleep(0.1) except: break def run(self): self.get_data() if __name__ == '__main__': q = multiprocessing.Queue() t1 = TestA(q) t1.start() for i in range(4): t2 = TestB(q) t2.start()
在子进程中不能使用input,因为输入台只显示在主进程中,故如果在子进程中使用input,会导致报错。
浙公网安备 33010602011771号