0
点赞
收藏
分享

微信扫一扫

2 - 进程与线程 - Python - multiprocessing 两种方法实现多进程 - 进程池 / 简单Process / - 进程堵塞join 与 sleep()线程睡眠

目录

一、进程池

进程池 map() 和 imap() 方法的实现

代码演示:


    
import multiprocessing
    
def func(name):
      print('start process {}'.format(name))
      return name.upper()
    
if __name__ == '__main__':
      p = multiprocessing.Pool(5)  # 限制每次执行的进程数为 5 个进程
      print(p.map(func,['map','map']))  # 开启一个进程
      for i in p.imap(func,['imap','imap']):  # 开启了 2 个进程
        print(i)							# 有两个参数就开启两个进程
    

运行结果:
在这里插入图片描述

进程池 apply_async() 的实现

代码演示:

#!/usr/bin/env python
import multiprocessing
import time

def func(name,plan):
    print('start process {} 计划'.format(plan))
    time.sleep(2)
    return name.upper()


if __name__ == '__main__':
    results = []
    p = multiprocessing.Pool(5) # 限制运行的进程数量为 5 个
    for i in range(7):          # 开启 7 个进程,而 7 个进程超过了 5 个,所以限制了 2 个进程,不给放行
        res = p.apply_async(func, args=('诸葛亮','B'))
        results.append(res)
    for i in results:
        print(i.get(2.1))  # 限制获取进程返回值的超时时间为 2.1 秒
        

运行结果:
在这里插入图片描述
一次只有 5 个进程在运行,另外 2 个进程,不允许运行。

这里使用列表来存储队列 Queue 对象,应该是提前用了 Queue 模块的 put() 方法,然后返回一个队列对象。

二、简单 Process 方法

代码演示:

#!/usr/bin/env python
    
from multiprocessing import Process
import os
import time
    
def func(name):
      print('start a process {}'.format(name))
      time.sleep(3)
      print('the process parent id :',os.getppid())
      print('the process id is :',os.getpid())
    
if __name__ =='__main__':
      processes = []
      for i in range(2):
        p = Process(target=func,args=(i,))
        processes.append(p)
      for i in processes:
        i.start()
      print('start all process')
      for i in processes:
        i.join()
        #pass
      print('all sub process is done!')

运行结果
在这里插入图片描述

python 多线程不是无法找到 id,而是因为多线程是数据共享的,所以所有的多线程都是共享一个共享 id
参考链接:
获得进程id_浅谈python中的多线程和多进程(二)

Tips:

三、进程堵塞 join 理解

在这里进程堵塞,是由系统将在工作队列内的主进程安排进了等待队列内,导致只执行在工作队列内的子进程,而不执行主进程,从而形成了一个主进程堵塞的现象。

相关引用如下所示:

在这里插入图片描述

在这里插入图片描述
参考链接:
终于想明白操作系统的中断和进程阻塞了

四、进程的 sleep() 线程睡眠理解

sleep() 针对的是线程,又因为每一个进程都有一个主线程,所以即使是在主进程创建子进程后,在子进程的执行函数内,sleep() 线程睡眠仍旧是对子进程起作用,因为sleep() 线程睡眠针对的是子进程的主线程。

举报

相关推荐

0 条评论