Python 多进程 multiprocessing 基本用法

multiprocessing 是Python中管理多进程的包,本文主要介绍 multiprocessing 的基本用法。基本用法和多线程的 threading 用法相同。

multiprocessing提供了一个Process类来代表一个进程对象,这个对象可以理解为一个独立的进程,可以执行另外的事情。

进程和线程对比:

进程:能够完成多任务,一台电脑可以开多个浏览器;

线程:能够完成多任务,一个微信可以同时和多人聊天;

进程是操作系统资源分配的基本单位,而线程,则是任务调度和执行的基本单位;

 

系统为每个进程分配不同的内存空间;

 

而对线程而言,除了CPU外,系统不会为线程分配内存(线程所使用的资源来自其所属进程的资源),线程组之间只能共享资源。

多进程示例1:

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,会导致报错。

 

 

posted on 2023-04-15 14:07  木去  阅读(101)  评论(0)    收藏  举报