python并发编程--进程--其他模块-从菜鸟到老鸟(三)

concurrent模块

1、concurrent模块的介绍

  • concurrent.futures模块提供了高度封装的异步调用接口
  • ThreadPoolExecutor:线程池,提供异步调用
  • ProcessPoolExecutor:进程池,提供异步调用
  • ProcessPoolExecutor 和 ThreadPoolExecutor:两者都实现相同的接口,该接口由抽象Executor类定义。

2、基本方法

  1. submit(fn, *args, **kwargs) :异步提交任务
  2. map(func, *iterables, timeout=None, chunksize=1) :取代for循环submit的操作
  3. shutdown(wait=True) :相当于进程池的pool.close()+pool.join()操作
  • wait=True,等待池内所有任务执行完毕回收完资源后才继续
  • wait=False,立即返回,并不会等待池内的任务执行完毕
  • 但不管wait参数为何值,整个程序都会等到所有任务执行完毕
  • submit和map必须在shutdown之前
  • result(timeout=None) :取得结果
  • add_done_callback(fn) :回调函数

3、进程池和线程池

池的功能:限制进程数或线程数.

什么时候限制: 当并发的任务数量远远大于计算机所能承受的范围,即无法一次性开启过多的任务数量 我就应该考虑去限制我进程数或线程数,从保证服务器不崩.

3.1 进程池

from concurrent.futures import ProcessPoolExecutor
import os
import time
def task(i):
    print("第"+str(i)+"个在执行任务id:"+str(os.getpid()))
    time.sleep(1)
if __name__ == ‘__main__‘:
    start=time.time()

    pool = ProcessPoolExecutor(4) # 进程池里又4个进程

    for i in range(5): # 5个任务
        pool.submit(task,i)# 进程池里当前执行的任务i,池子里的4个进程一次一次执行任务
    pool.shutdown()
    print("耗时:",time.time()-start)

3.2 线程池

from concurrent.futures import ThreadPoolExecutor
from threading import currentThread

import time
def task(i):
    print("第"+str(i)+"个在执行任务id:"+currentThread().name)
    time.sleep(1)
if __name__ == ‘__main__‘:
    start = time.time()

    pool = ThreadPoolExecutor(4) # 进程池里又4个线程
    for i in range(5): # 5个任务
        pool.submit(task,i)# 线程池里当前执行的任务i,池子里的4个线程一次一次执行任务
    pool.shutdown()
    print("耗时:",time.time()-start)

 3.3Map的用法

可以将多个任务一次性的提交给进程、线程池

from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
import os,time,random
def task(i):
    print("第"+str(i)+"个在执行任务id:"+str(os.getpid()))
    time.sleep(1)

if __name__ == ‘__main__‘:
    start=time.time()
    pool=ProcessPoolExecutor(max_workers=3)  #也可以换成ThreadPoolExecutor
    pool.map(task,range(1,5)) #map取代了for+submit
    pool.shutdown()
    print("耗时:",time.time()-start)

原文地址:https://www.cnblogs.com/wqbin/p/12593635.html

时间: 2024-10-09 06:08:20

python并发编程--进程--其他模块-从菜鸟到老鸟(三)的相关文章

Python并发编程-进程 线程 协程

一.进程 进程:就是一个程序在一个数据集上的一次动态执行过程. 进程由三部分组成: 1.程序:我们编写的程序用来描述进程要完成哪些功能以及如何完成 2.数据集:数据集则是程序在执行过程中所需要使用的资源 3.进程控制块:进程控制块用来记录进程的外部特征,描述进程的执行变化过程,系统可以利用它来控制和管理进程,它是系统感 知进程存在的唯一标志. 二.线程                                                                        

python并发编程-进程理论-进程方法-守护进程-互斥锁-01

操作系统发展史(主要的几个阶段) 初始系统 1946年第一台计算机诞生,采用手工操作的方式(用穿孔卡片操作) 同一个房间同一时刻只能运行一个程序,效率极低(操作一两个小时,CPU一两秒可能就运算完了) 联机批处理系统 脱机批处理系统 多道程序系统 1.空间上的复用 ? 多个程序公用一套计算机硬件 2.时间上的复用 ? 切换+保存状态 ? 保存状态:保存当前的运行状态,下次接着该状态继续执行 ? 切换的两种情况 ? (1) 当一个程序遇到 I/O 操作(不需要使用CPU),操作系统会剥夺该程序的C

Python并发编程—进程

多任务编程 1.意义: 充分利用计算机多核资源,提高程序的运行效率. 2.实现方案 :多进程 , 多线程 3.并行与并发 并发 : 同时处理多个任务,内核在任务间不断的切换达到好像多个任务被同时执行的效果,实际每个时刻只有一个任务占有内核. 并行 : 多个任务利用计算机多核资源在同时执行,此时多个任务间为并行关系. 进程(process) 进程理论基础 1.定义 : 程序在计算机中的一次运行. 程序是一个可执行的文件,是静态的占有磁盘. 进程是一个动态的过程描述,占有计算机运行资源,有一定的生命

Python并发编程-进程池

为什么有进程池的概念 效率问题 每次开启进程,都需要开启属于这个进程的内存空间 寄存器,堆栈 进程过多,操作系统的调度 进程池 python中的 先创建一个属于进程的池子 这个池子指定能存放多少进程 先将这些进程创建好 更高级的进程池 3,20 默认启动3个进程 处理能力不够的时候,加进程 最多20个 python中没有 from multiprocessing import Pool,Process import time #Process就无需使用了 def func(n): for i i

Python并发编程-进程间数据共享

Manager中进程数据不安全 通过加锁解决 from multiprocessing import Manager,Process,Lock def main(dic,lock): lock.acquire() dic['count'] -=1 print(dic) lock.release() if __name__ == '__main__': m = Manager() l = Lock() dic = m.dict({'count':100}) #主进程中数据提供到子进程去操作 p_l

Python并发编程—进程池

进程池实现 1.必要性[1] 进程的创建和销毁过程消耗的资源较多[2] 当任务量众多,每个任务在很短时间内完成时,需要频繁的创建和销毁进程.此时对计算机压力较大[3] 进程池技术很好的解决了以上问题. 2.原理 创建一定数量的进程来处理事件,事件处理完进 程不退出而是继续处理其他事件,直到所有事件全都处理完毕统一销毁.增加进程的重复利用,降低资源消耗. 3.进程池实现 [1] 创建进程池对象,放入适当的进程 from multiprocessing import Pool Pool(proces

python 并发编程 基于gevent模块 协程池 实现并发的套接字通信

基于协程池 实现并发的套接字通信 客户端: from socket import * client = socket(AF_INET, SOCK_STREAM) client.connect(('127.0.0.1', 8080)) while True: msg = input(">>>:").strip() if not msg:break client.send(msg.encode("utf-8")) data = client.recv(

Python并发编程之进程2

引言 本篇介绍Python并发编程下的进程,先介绍进程的相关知识,然后对python中multiprocessing模块进行介绍(Process.Pipe.Queue以及 Lock). 进程(process) 在面向线程设计的系统(如当代多数操作系统.Linux 2.6及更新的版本)中,进程本身不是基本运行单位,而是线程的容器. 进程拥有自己独立的内存空间,所属线程可以访问进程的空间. 程序本身只是指令.数据及其组织形式的描述,进程才是程序的真正运行实例. 例如,我们在PyCharm开发环境中写

进程,操作系统,Python并发编程之多进程

1.进程基础知识 1.程序:若干文件 2.进程:一个正在执行的文件,程序 3.进程被谁执行:cpu最终运行指定的程序 4.操作系统调度作用:将磁盘上的程序加载到内存,然后交由CPU去处理,一个CPU正在运行的一个程序,就叫开启了一个进程 2.操作系统 1.操作系统:存在于硬盘与软件之间,管理.协调.控制软件与硬件的交互 2.操作系统的作用:将一些复杂的硬件封装成简单的借口,便于使用;合理地调度分配多个进程与cpu的关系,让其有序化 3.操作系统发展史 ①第一代电子计算机(1940-1955) 二