Python控制多进程与多线程并发数总结
Python  /  管理员 发布于 7年前   185
一、前言
本来写了脚本用于暴力破解密码,可是1秒钟尝试一个密码2220000个密码我的天,想用多线程可是只会一个for全开,难道开2220000个线程吗?只好学习控制线程数了,官方文档不好看,觉得结构不够清晰,网上找很多文章也都不很清晰,只有for全开线程,没有控制线程数的具体说明,最终终于根据多篇文章和官方文档算是搞明白基础的多线程怎么实现法了,怕长时间不用又忘记,找着麻烦就贴这了,跟我一样新手也可以参照参照。
先说进程和线程的区别:
不能理解的话简单打比方就是一个进程就像一个程序一样,并发互不干扰。一个进程靠一个或多个线程执行处理,并发的线程是cpu在不停的来回切换执行,当然是快到你感觉不出的。
拿上面我遇到的困难来说吧,大量的数据需要执行相同的处理,一个操作中间可能会有一些等待时间,一个一个执行浪费大量时间,那么就同时执行吧,我们可以用两种并行办法:
进程并行或者线程并行
各有优缺点,要看情况,不是绝对的,在此不讨论这个,这引出下面两种Python并行处理方法(注释感觉很清晰详细了,不再多说)
二、进程处理方法
#coding:utf-8import randomfrom time import sleepimport sysimport multiprocessingimport os##需求分析:有大批量数据需要执行,而且是重复一个函数操作(例如爆破密码),如果全部开始线程数N多,这里控制住线程数m个并行执行,其他等待#lock=multiprocessing.Lock()#一个锁def a(x):#模拟需要重复执行的函数 lock.acquire()#输出时候上锁,否则进程同时输出时候会混乱,不可读 print '开始进程:',os.getpid(),'模拟进程时间:',x lock.release() sleep(x)#模拟执行操作 lock.acquire() print '结束进程:',os.getpid(),'预测下一个进程启动会使用该进程号' lock.release()list=[]for i in range(10):#产生一个随机数数组,模拟每次调用函数需要的输入,这里模拟总共有10组需要处理 list.append(random.randint(1,10)) pool=multiprocessing.Pool(processes=3)#限制并行进程数为3pool.map(a,list)#创建进程池,调用函数a,传入参数为list,此参数必须是一个可迭代对象,因为map是在迭代创建每个进程
输出:
三、线程处理方法:
#coding:utf-8import threadingimport randomimport Queuefrom time import sleepimport sys##需求分析:有大批量数据需要执行,而且是重复一个函数操作(例如爆破密码),如果全部开始线程数N多,这里控制住线程数m个并行执行,其他等待##继承一个Thread类,在run方法中进行需要重复的单个函数操作class Test(threading.Thread): def __init__(self,queue,lock,num): #传递一个队列queue和线程锁,并行数 threading.Thread.__init__(self) self.queue=queue self.lock=lock self.num=num def run(self): #while True:#不使用threading.Semaphore,直接开始所有线程,程序执行完毕线程都还不死,最后的print threading.enumerate()可以看出 with self.num:#同时并行指定的线程数量,执行完毕一个则死掉一个线程 #以下为需要重复的单次函数操作 n=self.queue.get()#等待队列进入 lock.acquire()#锁住线程,防止同时输出造成混乱 print '开始一个线程:',self.name,'模拟的执行时间:',n print '队列剩余:',queue.qsize() print threading.enumerate() lock.release() sleep(n)#执行单次操作,这里sleep模拟执行过程 self.queue.task_done()#发出此队列完成信号threads=[]queue=Queue.Queue()lock=threading.Lock()num=threading.Semaphore(3)#设置同时执行的线程数为3,其他等待执行#启动所有线程for i in range(10):#总共需要执行的次数 t=Test(queue,lock,num) t.start() threads.append(t) #吧队列传入线程,是run结束等待开始执行,放下面单独一个for也行,这里少个循环吧 n=random.randint(1,10) queue.put(n)#模拟执行函数的逐个不同输入#吧队列传入线程,是run结束等待开始执行#for t in threads:# n=random.randint(1,10)# queue.put(n)#等待线程执行完毕for t in threads: t.join()queue.join()#等待队列执行完毕才继续执行,否则下面语句会在线程未接受就开始执行print '所有执行完毕'print threading.active_count()print threading.enumerate()
输出:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号
