进程和线程调度,线程池核心线程执行完成

  进程和线程调度,线程池核心线程执行完成

  Python3.2带来了concurrent.futures模块。该模块具有线程池和进程池的功能,管理并行编程任务,处理不确定运行进程和进程/线程同步。

  该模块由以下部分组成:

  Concurrent.futures.executor:这是一个提供异步运行方法的虚拟基类。Submit (function,argument):调度函数(callable object)的执行将argument作为参数传递。Map(function,argument):以argument为参数执行函数,以

异步

的方式执行。Shut down (waiting=true):通知执行程序释放所有资源。包含函数的异步执行。Future对象是一个提交任务,即带有参数的executor函数的实例。Executor是一个抽象类,可以通过子类访问。这意味着线程或进程的执行程序会进行轮询。因为线程或进程的实例是与资源相关的任务,所以建议将线程或进程分组到“池”中,作为可重用的启动器或执行器。

  2.1.使用线程池和进程池线程池或进程池用于优化和优化程序中线程/进程的使用。库允许您向执行者提交任务。池由两部分组成,一部分是内部队列,存储要执行的任务;另一个是用于执行这些任务的一系列进程或线程。游泳池的主要目的是回收利用。是使线程或进程在其生命周期中多次可用。它减少了创建线程和进程的开销,提高了程序的性能。复用不是必要规则,但却是程序员在APP应用中使用池的主要原因。

  2.2.准备。水流。Futures模块提供了Executor的两个子类,分别独立操作线程池和进程池。有两个子类别:

  concurrent.futures .线程池执行器(max _ workers)concurrent . futures . http://www . Sina . com/(max _ workers)

  2.3.如何…下面的示例代码展示了线程池和进程池的作用:这里的任务是给出包含1到10的listnumber_list。将列表中的数字乘以1 (2) 1 2 3 … 1000000之和。)这个任务只是为了消耗时间。

  以下代码分别进行了测试:

  执行是在一个有五个工作线程的线程池中顺序执行的。在有五个工作人员的进程池中运行。(译者注:原代码有误。此处发布的代码和执行结果已被修改。感谢您的问题#16,@Microndgt,关于第4章第2节的程序。)代码如下。

  输入内容。FutureSimportTimeNumber _ list=[1,2,3,4,5,6,7,8,9,10]defevaluate_item(x) 336666其中result_item=count(x)输入/输出结果返回result _ itemDEFCount(Number)33330 1000000):I=i1 returni * Number _ _ name _= _ main _ :# start _ time=time . time(for iteminnumber _ list:print(evaluate _ item)按顺序运行)作为执行人:futures=[executor . submit(evaluate _ Item,Item(for itemnumber _ list(for futureinconcurrent . furent))print(threadpoolexecutionin(str)time . time)-start _ time _ 1),seconds) #进程池start_time_2

  =time . time()with concurrent . futures . processpoolexecutor(max _ workers=5)as executor:futures=[executor . submit(evaluate _ item,item)for item in number _ list]for future . futures . as _ completed(futures):Print(future . result())Print( process pool execution in str(time . time()-start _ time _ 2), seconds )运行这段代码,我们可以看到运行时的输出结果:

  $ python 3池。py 10000000020000000000300000000550000000005700000000580000000000000510005如同ThreadPoolExecutor一样,ProcessPoolExecutor是一个遗嘱执行人,使用一个线程池来并行执行任务。然而,和ThreadPoolExecutor不同的是,ProcessPoolExecutor使用了多核处理的模块,让我们可以不受GIL的限制,大大缩短执行时间。

  另外一个例子:import glob import OS import time import cv2 from concurrent import futures from multi processing import CPU _ count import numpy as NP import concurrentfutures save _ path= D:/py charm _ workspace/test/blur 18 x 18 def mkdir(path):folder=OS。路径。存在(路径)如果不是文件夹:#判断是否存在文件夹如果不存在则创建为文件夹os.makedirs(路径)# makedirs创建文件时如果路径不存在会创建这个路径打印(-创建新文件夹.- ) else: print( -有这个文件夹!- )mkdir(保存路径)#调用函数current _ image=10 def change _ color(image _ file):文件名=图像文件。split( )[-1]img=cv2。im read(image _ file)size _=[img。形状[0],img。shape[1]]w=size _[0]h=size _[1]data=NP。array(img,dtype= int 32 )for I in range(w):for j in range(h):temp=(data[:0][i][j] data单进程执行def loadData(dataDir): print(我要开始执行了)用于glob中的image _ file。glob(OS。路径。join(数据目录, * .png ):file _ name=image _ file。split( )[-1]img=cv2。im read(image _ file)size _=[img。形状[0],img。shape[1]]w=size _[0]h=size _[1]data=NP。array(img,dtype= int 32 )for I in range(w):for j in range(h):temp=(data[:0][i][j] data[:1][i][j多进程执行def加载数据2(dataDir):start _ time=time。时间()#多进程处理,你有多少中央处理器核,就启动多少计算机编程语言进程,我的是8个核,就同时启动8个# 启动的更多最大工人数提升并不大,所以此处我建议最大工人数和核心数相同更好以并发。期货。processpoolexecutor(max _ workers=8)作为执行人:image _ files=globglob(OS。路径。join(数据目录, * .png)) #第一个参数是处理函数,第二个参数是原始数据。用8个进程,来并行对图像文件文件进行加载并调整大小处理executor.map(change_color,image _ files)print( ProcessPoolExecutor加载数据耗时:{} 。格式(时间。time()-start _ time))if _ _ name _ _= _ _ main _ _ :dataDir=r d: IDEA _ workspace u former datasets colorization 10 sidd train ground truth print( CPU kenels:{ } .format(CPU _ count())#加载数据(dataDir)加载数据2(dataDir)

进程和线程调度,线程池核心线程执行完成