多进程详细讲解

一、什么是多进程

相信看过我其他博客的同学已经对多线程和多进程有一个简单的了解了,下面我们简单说一下多进程。我们知道在进行较多的I/O操作时候,比如socket server之类的可以用到多线程,那么什么时候用多进程呢?我们在进行大量的密集运算时候就要用到多进程。下面我们讲解一下多进程的相关知识:

(1)启动多进程,并在多进程中启动多线程

#启动多进程
import multiprocessing  #多进程
import time,threading   #多线程

def thread_run():
    print(threading.get_ident())   #打印当前线程ID

def f(name):
    time.sleep(2)
    print('hello',name)
    t=threading.Thread(target= thread_run,) #在多进程调用的函数中创建一个多线程
    t.start()

if __name__ == '__main__': #区分主动执行脚本还是从别的代码里导入,如果主动执行下面的就执行(在window中需要加入这句话)

    for i in range(10): #启动10个多进程
        p=multiprocessing.Process(target=f,args= ('我是%s'%i,))
        p.start()
        p.join()

执行之后会启动10个多进程,每个多进程中都会启动一个多线程,并打印该线程的id,结果如下:
这里写图片描述


(2)每一个子进程都是由父进程启动的

我们需要知道,每一个子进程都是由父进程启动的。下面我们来通过获取进程id的方式来证明一下:

#我们这里父进程是:pycharm本身   由pycharm启动了子进程
from multiprocessing import Process
import os

def info(title):
    print(title)
    print('module name:',__name__)   #获取__name__名称
    print('parent process:',os.getppid())  #得到父进程id
    print('process id:',os.getpid())      #得到自己id
    print('\n\n')

def f():
    info('\033[31;1mfunction f\033[0m')   #子进程调用info()


if __name__ == '__main__':
    info('\033[32;1mmain process line\033[0m')   #父进程调用info()
    p=Process(target= f,)  #自动多进程
    p.start()
    p.join()

我们分别用父进程和子进程来调用函数info(),打印自己的和父进程的id,结果如下:
这里写图片描述
观察一下,父进程是黄色的,它的父进程id是16624,这个是pycharm本身,它的id是13624,子进程是红色的,它的父进程id是13624,也就父进程,它本身的id是12444,所以可以说是父线程创建了子线程。


(3)进程间的通信

大家都知道一个进程内的线程之间可以进行数据通信,但是两个进程不能直接通信,就比如我们不能利用腾讯视频来买淘宝的东西,那么我们怎么才能实现进程之间的数据传递和数据修改呢??
下面我简单介绍一下3个方法来实现进程间的数据通信:

  1. Queues:实现两个进程之间的数据传递
  2. Pipes:管道形式数据传递,建立一个管道通讯
  3. Managers:实现两个进程的数据共享(可以修改数据,不仅仅是传递数据)

先说一下队列方法(Queues):

from multiprocessing import Process ,Queue #导入Queue模块

def f(q1):
    q1.put(['hello',42]) #在子进程中把数据['hello',42]放入队列中

if __name__ == '__main__':
    q=Queue()  #启动一个进程的队列
    p=Process(target= f,args= (q,))  #在启动子进程时候,将进程的队列q赋值进去
    p.start()
    print(q.get())     #父进程从队列中取数据,实现两个进程之间的数据通讯
    p.join()

结果是:
这里写图片描述


然后介绍一下Pipes方法,就是在进程之间生成一个管道进行数据传递。

from multiprocessing import Process ,Pipe  #导入Pipe模块

def f1(conn):  
    conn.send([42,'hello'])    #子进程发送数据
    print('from parent:',conn.recv()) #子进程接收父进程的数据
    conn.close()

if __name__ =='__main__':
    parent_conn,child_conn=Pipe()   #生成管道的两头,一个父进程一个子进程
    p=Process(target= f1,args=(child_conn,)) #创建一个子进程
    p.start()
    print(parent_conn.recv())   #父进程这里接收子进程发送的数据
    parent_conn.send('你好')    #父进程发送数据给子进程
    p.join()

结果是:
这里写图片描述


最后我们说明Managers这个方法,可以进行进程之间的数据修改。

from multiprocessing import Process ,Manager #导入Manager方法
import os

def f2(d,l):
    d[os.getpid()]=os.getpid() #10个进程都在修改字典,键和值都为每个子进程的id
    l.append(os.getpid())  #10个进程都在扩充列表
    print(l)

if __name__ == '__main__':
    with Manager() as manager:
        d=manager.dict() #manager中的生成一个可在多个进程中传递、共享数据的字典

        l=manager.list(range(5))  #manager中的生成一个可在多个进程中传递、共享数据的列表
        p_list=[]
        for i in range(10): #创建10个子进程
            p=Process(target=f2,args= (d,l))
            p.start()
            p_list.append(p)
        for res in p_list :  #等待所有进程执行完毕
            res.join()
        print(d)
        print(l)

结果是:
这里写图片描述
可以发现进程之间可以进行数据修改。


(4)进程池

进程池是防止启动进程过多,系统负荷大,而设置的。看一个例子:

from multiprocessing import Process,Pool  #导入进程池
import time,os

def Foo(i):
    time.sleep(2)
    print('到了2s')
    return i+100
def Bar(arg):
    print('结果:',arg)

if __name__  == '__main__':  
    pool=Pool(processes= 5)  #允许进程池同时放入5个进程

    for i in range(10):  #10个进程都启动 但是一次只能运行5个
        #pool.apply(func= Foo,args=(i,))  #串行执行进程,一次执行1个进程
        pool.apply_async(func= Foo,args=(i,),callback= Bar) #并行执行进程,一次5个,callback回调 Foo执行完就会执行Bar
    print('end')
    pool.close()
    pool.join() #等待进程池中的进程执行完毕  必须先close()  在join()

结果是:
这里写图片描述
可以利用进程池来限制每次执行进程的数量,防止电脑负荷过大。

  • 6
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Python 中有多种方法可以实现多进程,包括使用 `os.fork()`、`multiprocessing` 模块和 `concurrent.futures` 模块等。 1. 使用 `os.fork()` `os.fork()` 是一个 Unix 系统调用,它可以复制当前进程,创建一个新进程。父进程和子进程会共享代码段,但是各自有独立的数据段和堆栈段。在 Python 中,可以通过 `os.fork()` 实现多进程,示例代码如下: ```python import os pid = os.fork() if pid == 0: # 子进程 print('I am child process, my pid is', os.getpid()) else: # 父进程 print('I am parent process, my pid is', os.getpid(), 'and my child pid is', pid) ``` 2. 使用 `multiprocessing` 模块 `multiprocessing` 模块是 Python 内置的多进程模块,可以很方便地实现多进程。示例代码如下: ```python import multiprocessing def worker(): print('I am child process, my pid is', os.getpid()) if __name__ == '__main__': # 创建子进程 p = multiprocessing.Process(target=worker) # 启动子进程 p.start() # 等待子进程结束 p.join() # 父进程 print('I am parent process, my pid is', os.getpid()) ``` 3. 使用 `concurrent.futures` 模块 `concurrent.futures` 模块是 Python 内置的线程进程模块,可以很方便地实现异步任务。示例代码如下: ```python import concurrent.futures def worker(): print('I am child process, my pid is', os.getpid()) if __name__ == '__main__': # 创建进程 with concurrent.futures.ProcessPoolExecutor() as executor: # 提交异步任务 future = executor.submit(worker) # 等待任务完成 result = future.result() # 父进程 print('I am parent process, my pid is', os.getpid()) ``` 以上是三种常用的 Python 多进程实现方式,具体选用哪种方式,需要根据实际情况来决定。需要注意的是,在 Windows 平台上,由于 `os.fork()` 不被支持,因此不能使用第一种方式创建多进程。 ### 回答2: Python多进程是指利用Python编程语言提供的多进程模块来实现并行计算。Python的多进程模块主要包括了`multiprocessing`和`concurrent.futures`两个子模块,用于实现多进程的创建、启动和管理。 使用Python的多进程可以带来多个优点。首先,使用多进程可以充分利用多核处理器的计算资源,提高程序的运行效率。其次,多进程可以实现程序的并行计算,将计算任务分配到多个进程中同时执行,从而缩短程序的运行时间。同时,多进程还可以解决Python的全局解释锁(GIL)问题,使得并行计算更加高效。 在Python中,使用多进程可以通过以下几个步骤实现。首先,需要导入`multiprocessing`或`concurrent.futures`模块。然后,通过创建`Process`或`Executor`对象来创建进程。接下来,可以使用`start()`方法启动进程,使用`join()`方法等待进程结束。同时,还可以使用`Process`或`Executor`对象提供的其他方法来管理进程的状态和结果。 除了基本的多进程操作外,Python的多进程模块还提供了一些辅助功能,如进程间通信、进程等。进程间通信可以通过`Queue`、`Pipe`等来实现,用于实现进程之间的数据交换。而进程可以通过`Pool`来实现,用于管理多个进程的执行和返回结果。 总之,Python多进程是一种并行计算的方法,可以充分利用计算资源和提高程序的运行效率。通过多进程的方式,可以实现更快速和有效的数据处理和计算。 ### 回答3: Python 多进程是指在一个 Python 程序中同时运行多个进程的能力。多进程可以充分利用多核处理器,并且能够提高程序的运行效率和性能。 在 Python 中,我们可以使用 `multiprocessing` 模块来实现多进程。通过创建多个进程,每个进程都拥有独立的内存空间和数据栈,可以同时运行不同的任务。 使用 `multiprocessing` 模块,我们可以创建一个进程,通过调用其 `Pool` 类的 `map()` 或 `apply()` 方法,将任务分配给进程中的不同进程来并行执行。这样,我们可以有效地利用多个 CPU 核心,提高程序的运行效率。 需要注意的是,每个进程都有自己独立的内存空间,因此在多进程编程时,需要特别注意进程间的数据共享和同步问题。在多进程编程中,常用的同步机制包括锁、信号量、事件等,可以通过 `multiprocessing` 模块中的相关类来实现。 此外,多进程编程还可以进一步拓展为分布式进程编程,即将进程分布在多台机器上运行,通过网络进行通信和协调。在 Python 中,可以使用 `multiprocessing` 模块中的 `Manager` 类来实现分布式进程。 总的来说,Python 的多进程编程能够提高程序的执行效率和性能,特别适合于那些需要大量计算的任务,如数据处理、图像处理等。通过合理地运用多进程,并结合适当的同步机制,我们可以充分发挥多核处理器的潜力,提高程序的运行效率和吞吐量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值