码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2020-03-29 18:06:17      阅读:114      评论:0      收藏:0      [点我收藏+]

标签:异步调用   lex   函数   python   dom   功能   join   strong   ble   

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)

技术图片

 

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

标签:异步调用   lex   函数   python   dom   功能   join   strong   ble   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!