首页 > 系统相关 >多进程

多进程

时间:2023-11-21 15:22:22浏览次数:27  
标签:__ ... print time 进程 Pool

进程创建

Process

from multiprocessing import Process
import os


# 子进程要执行的代码
def run_proc(name):
    print('启动子进程{}{}'.format(name, os.getpid()))


if __name__ == '__main__':
    print('父进程{}'.format(os.getpid()))
    p = Process(target=run_proc, args=('test',))
    print('子进程将要启动')
    p.start()
    p.join()
    print('子进程结束')

multiprocessing模块就是跨平台版本的多进程模块,提供了一个Process类来代表一个进程对象,这个对象可以理解为是一个独立的进程,可以执行另外的事情

当需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态成生多个进程,但如果是上百甚至上千个目标,手动的去创建进程的工作量巨大,此时就可以用到multiprocessing模块提供的Pool方法。

Pool(进程池)

初始化Pool时,可以指定一个最大进程数,当有新的请求提交到Pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求;但如果池中的进程数已经达到指定的最大值,那么该请求就会等待,直到池中有进程结束,才会用之前的进程来执行新的任务

"""
如果要启动大量的子进程,可以用进程池的方式批量创建子进程:
"""
from multiprocessing import Pool
import os, time, random


def long_time_task(name):
    print('运行任务 %s (%s)...' % (name, os.getpid()))
    start = time.time()
    time.sleep(random.random() * 3)
    end = time.time()
    print('任务 %s 运行 %0.2f 秒' % (name, (end - start)))


if __name__ == '__main__':
    print('父进程 %s.' % os.getpid())
    p = Pool(4)  # 创建进程池中最多存4个子进程
    for i in range(5):
          # Pool().apply_async(要调用的目标,(传递给目标的参数元祖,))
          # 每次循环将会用空闲出来的子进程去调用目标
        p.apply_async(long_time_task, args=(i,))
    print('等待所有子进程完成...')
    p.close()  # 关闭进程池,关闭后po不再接收新的请求
    p.join()  # 等待po中所有子进程执行完成,必须放在close语句之后
    print('所有子进程完成.')

# 运行结果
>>> 等待所有子进程完成...
>>> 运行任务 0 (3722)...
>>> 运行任务 1 (3723)...
>>> 运行任务 2 (3724)...
>>> 运行任务 3 (3725)...
>>> 任务 3 运行 0.67 秒
>>> 运行任务 4 (3725)...
>>> 任务 2 运行 1.29 秒
>>> 任务 0 运行 2.00 秒
>>> 任务 1 运行 2.77 秒
>>> 任务 4 运行 2.31 秒
>>> 所有子进程完成.

multiprocessing.Pool常用函数解析:

  • apply_async(func[, args[, kwds]]) :使用非阻塞方式调用func(并行执行,堵塞方式必须等待上一个进程退出才能执行下一个进程),args为传递给func的参数列表,kwds为传递给func的关键字参数列表;
  • close():关闭Pool,使其不再接受新的任务;
  • terminate():不管任务是否完成,立即终止;
  • join():主进程阻塞,等待子进程的退出, 必须在close或terminate之后使用;

Pool对象调用join()方法会等待所有子进程执行完毕,调用join()之前必须先调用close(),调用close()之后就不能继续添加新的Process

 

标签:__,...,print,time,进程,Pool
From: https://www.cnblogs.com/yogayao/p/17846637.html

相关文章

  • shell 展开之进程替换# 深度解析 管道符|和输入输出<< >>重定向的区别
    参考链接https://blog.csdn.net/zwlove5280/article/details/113609342shell展开中的进程替换可以说是非常难懂的一部分,它的语法为有两种>(list)##接受输入看作一个整体,相当于文件描述或<(list)#接受输出在<<TheLinuxCommandLine>>一书中提到了这样一个事,代码......
  • 解锁数据库运维秘籍:掌握AntDB-T动态共享内存,提升进程间通信效率
    动态共享内存是AntDB数据库通信的重要手段,本文主要阐述AntDB-T数据库动态共享内存的实现原理、实现方式与使用方法。AntDB-T数据库是一款企业级通用分布式关系型数据库,其数据库内核是基于进程模型实现的,因此进程间通信(IPC)是实现分布式架构间进行任务协作和数据共享的关键。实现进......
  • Android nice 进程优先级设置
    文章目录1.简介2.查看nice值3.修改nice的值1)adb命令修改2)在源码中修改1.简介在Android中,可以使用nice值来设定一个进程的优先级,系统的调度器可以根据nice值来合理的调度进程,主要特点如下:在Android中,nice的取值范围为**-20~19**在Android中,nice值的默认大小为0在Android......
  • 【ORCAL】进程太厉害,影响了主业务系统,该怎么处理?
    v$locked_objectv$lock锁表的问题一、症状描述今天客户反馈说,他们的主业务系统宕机了,是因为某个服务器有个进程占用太多资源带宽,而且杀死后会自动恢复,严重影响业务,希望我们协助查询一下具体的原因!我分析了一下原因,应该是执行SQL或程序时,程序没有响应或SQL执行一......
  • 进程 和线程
     https://www.cnblogs.com/zyx110/p/10820315.html 大佬分享的包含了很多代码,之后再看吧 单线程:程序只有一条执行路径。一个进程可以包含多个线程。  Java程序的运行原理及JVM的启动是多线程的吗?A:Java程序的运行原理Java通过java命令会启动java虚拟......
  • 限制指定软件(进程)的网络带宽或设置优先级
    NetLimiter是一款功能强大的网络带宽控制软件,可以让您限制特定应用程序的网络带宽。它支持Windows7、8、10、11操作系统。下载页https://www.netlimiter.com/downloadhttps://download.netlimiter.com/nl/netlimiter-5.3.5.0.exe截图破解该软件可免费试用,但特定功能或......
  • Linux第五章进程管理11.10
    1、查看进程(1)psaux可以查看静态进程(2)psaux--sort-%cpu可以按照cpu占用的百分比的降序排列(3)ps-ef可以查看UID,PID,PPID等信息(4)psaxo可以自定义显示的字段2、动态查看进程(1)使用top命令;按回车键立马更新;按M键以内存占用率排序;按P键以cpu占用率排序;按N键用PID数值......
  • 进程间通信的方式之消息队列和共享内存
    消息队列消息队列就是保存在内核中的消息链表,包括Posix消息队列和SystemV消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。共享内存共享内存的机制,......
  • 进程与线程
    进程程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理IO的当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程。进程就可以视为......
  • 僵尸进程zombie讲解:
       ......