Python知识点20---池

提前说一点:如果你是专注于Python开发,那么本系列知识点只是带你入个门再详细的开发点就要去看其他资料了,而如果你和作者一样只是操作其他技术的Python API那就足够了。

如果看了我发的线程和进程的知识点的朋友,如果发散思维能力很强,那么可能会出现一个,就是我操作线程和进程的方法很low,导致两个问题

一是如果有很多需要创建的线程或进程一个一个的创建那要累死,而写for循环也不好控制

二是我写的操作方法,貌似只能操作普通的函数,而对于类的方法来说就是个灾难,因为会受self参数的影响,不传吧,报错,传吧,不知道传什么

所以在这篇博文中对操作线程和进程做一个补充,首先之前我操作的方法,是为了初学者能够直接看明白,但其实在正经开发中我们不会那样使用,我们会使用


下面看一下怎么使用进程池,并且在类中使用!!!!解决大家对self的疑惑

import multiprocessing 
import os,time

class Stu :

	def pri(self):
		print('--------进程',os.getpid(),'开始执行代码')
		time.sleep(2)
		print('--------进程',os.getpid(),'结束执行')

	def run(self) :
		#创建一个进程池,最多有6进程
		pool = multiprocessing.Pool(6)
		#循环,模拟向进程池中提交任务,直接通过self传递
		for i in range(10) :
			pool.apply_async(self.pri)
		#关闭池不在接收新的进程,一定要先关闭,不然提交动作会导致停止不了线程池
		pool.close()
		#等待池中的进程执行完毕,程序彻底结束,一定要调用这个方法,不然程序直接就是结束了
		pool.join()

if __name__ == '__main__' :
	stu = Stu()
	stu.run()

结果:
--------进程 4220 开始执行代码
--------进程 12500 开始执行代码
--------进程 9880 开始执行代码
--------进程 7028 开始执行代码
--------进程 696 开始执行代码
--------进程 11832 开始执行代码
--------进程 4220 结束执行
--------进程 12500 结束执行
--------进程 4220 开始执行代码
--------进程 12500 开始执行代码
--------进程 9880 结束执行
--------进程 696 结束执行
--------进程 7028 结束执行
--------进程 9880 开始执行代码
--------进程 696 开始执行代码
--------进程 11832 结束执行
--------进程 4220 结束执行
--------进程 12500 结束执行
--------进程 696 结束执行
--------进程 9880 结束执行

对普通方法使用进程池就不演示了,毕竟和之前的操作原理是一样的


下面看一下如何操作线程池,同样的直接演示在类中操作

from concurrent.futures import ThreadPoolExecutor,wait

class Stu :
	def myInfe(self) :
		print('-------')
		
	def run(self) :
		#创建一个线程池
		executor = ThreadPoolExecutor(max_workers=2)
		#提交一个任务
		task1 = executor.submit(self.myInfe)
		wait([task1])#这个方法的任务参数必须是列表

if __name__ == '__main__' :
	stu = Stu()
	stu.run()

上面这个是Python直接可以使用的线程池模块,我也给大家找了一个资源,详细的介绍了怎么使用它,大家有兴趣可以看看–》Python官方线程池的使用

但是大家注意,在Python开发中还有一种线程池,这个线程池不是Python直接自带的,你想要使用需要另外下载一个threadpool的包才可以,使用方法如下

import threadpool

def ThreadFun(arg1,arg2):  
	print(arg1+arg2)

def main():  
	device_list=[(1,2),(3,4),(5,6)]#准备参数
	
	task_pool=threadpool.ThreadPool(2)#2是线程池中最大线程的个数  
	
	request_list=[]#存放任务列表 
	
    #首先构造任务列表  
	for device in device_list:  
		request_list.append(threadpool.makeRequests(ThreadFun,device))
	
    #将每个任务放到线程池中,等待线程池中线程各自读取任务,然后进行处理,使用了map函数,不了解的可以去了解一下。  
	[ task_pool.putRequest(re) for re in request_list] 
	
    #等待所有任务处理完成,则返回,如果没有处理完,则一直阻塞  
	task_pool.poll()

main()
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值