Python控制多进程与多线程并发数总结


Posted in Python onOctober 26, 2016

一、前言

本来写了脚本用于暴力破解密码,可是1秒钟尝试一个密码2220000个密码我的天,想用多线程可是只会一个for全开,难道开2220000个线程吗?只好学习控制线程数了,官方文档不好看,觉得结构不够清晰,网上找很多文章也都不很清晰,只有for全开线程,没有控制线程数的具体说明,最终终于根据多篇文章和官方文档算是搞明白基础的多线程怎么实现法了,怕长时间不用又忘记,找着麻烦就贴这了,跟我一样新手也可以参照参照。

先说进程和线程的区别:

  1. 地址空间:进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有自己独立的地址空间;
  2. 资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源
  3. 线程是处理器调度的基本单位,但进程不是.
  4. 二者均可并发执行.

不能理解的话简单打比方就是一个进程就像一个程序一样,并发互不干扰。一个进程靠一个或多个线程执行处理,并发的线程是cpu在不停的来回切换执行,当然是快到你感觉不出的。

拿上面我遇到的困难来说吧,大量的数据需要执行相同的处理,一个操作中间可能会有一些等待时间,一个一个执行浪费大量时间,那么就同时执行吧,我们可以用两种并行办法:

进程并行或者线程并行

各有优缺点,要看情况,不是绝对的,在此不讨论这个,这引出下面两种Python并行处理方法(注释感觉很清晰详细了,不再多说)

二、进程处理方法

#coding:utf-8
import random
from time import sleep
import sys
import multiprocessing
import 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)#限制并行进程数为3
pool.map(a,list)#创建进程池,调用函数a,传入参数为list,此参数必须是一个可迭代对象,因为map是在迭代创建每个进程

输出:

Python控制多进程与多线程并发数总结

三、线程处理方法:

#coding:utf-8
import threading
import random
import Queue
from time import sleep
import 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()

输出:

Python控制多进程与多线程并发数总结

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python查找第k小元素代码分享
Dec 18 Python
Python文件处理
Feb 29 Python
Python读写txt文本文件的操作方法全解析
Jun 26 Python
python多线程socket编程之多客户端接入
Sep 12 Python
TensorFlow深度学习之卷积神经网络CNN
Mar 09 Python
python+pyqt5实现图片批量缩放工具
Mar 18 Python
Python对ElasticSearch获取数据及操作
Apr 24 Python
基于python的BP神经网络及异或实现过程解析
Sep 30 Python
PyCharm永久激活方式(推荐)
Sep 22 Python
PyTorch中Tensor的数据类型和运算的使用
Sep 03 Python
python对批量WAV音频进行等长分割的方法实现
Sep 25 Python
Python Selenium破解滑块验证码最新版(GEETEST95%以上通过率)
Jan 29 Python
Python网络爬虫项目:内容提取器的定义
Oct 25 #Python
Python实现ssh批量登录并执行命令
Oct 25 #Python
详解Python的Lambda函数与排序
Oct 25 #Python
Python脚本实现Web漏洞扫描工具
Oct 25 #Python
python+django快速实现文件上传
Oct 24 #Python
python实现简单爬虫功能的示例
Oct 24 #Python
简单谈谈Python中的反转字符串问题
Oct 24 #Python
You might like
关于PHP中操作MySQL数据库的一些要注意的问题
2006/10/09 PHP
PHP编程中八种常见的文件操作方式
2006/11/19 PHP
关于访问控制的一首PHP面试题(对属性或方法的访问控制)
2012/09/13 PHP
PHP跨时区(UTC时间)应用解决方案
2013/01/11 PHP
PHP Hash算法:Times33算法代码实例
2015/05/13 PHP
CodeIgniter框架验证码类库文件与用法示例
2017/03/18 PHP
自己的js工具 Cookie 封装
2009/08/21 Javascript
JavaScript 学习笔记(五)
2009/12/31 Javascript
基于Jquery的文字自动截取(提供源代码)
2011/08/09 Javascript
nodejs中实现sleep功能实例
2015/03/24 NodeJs
Javascript数组Array基础介绍
2016/03/13 Javascript
JavaScript Math 对象常用方法总结
2016/04/28 Javascript
vue父组件向子组件动态传值的两种方法
2017/11/11 Javascript
Vue2.2.0+新特性整理及注意事项
2018/08/22 Javascript
JavaScript中的连续赋值问题实例分析
2019/07/12 Javascript
Angular8路由守卫原理和使用方法
2019/08/29 Javascript
Vue关于组件化开发知识点详解
2020/05/13 Javascript
[02:33]2018 DOTA2亚洲邀请赛回顾视频 再次拾起那些美妙的时刻
2018/04/10 DOTA
[00:14]PWL:老朋友Mushi拍VLOG与中国玩家问好
2020/11/04 DOTA
Python调用C语言开发的共享库方法实例
2015/03/18 Python
Python中使用logging模块打印log日志详解
2015/04/05 Python
Python中设置变量访问权限的方法
2015/04/27 Python
Python捕捉和模拟鼠标事件的方法
2015/06/03 Python
简单掌握Python的Collections模块中counter结构的用法
2016/07/07 Python
Python用字典构建多级菜单功能
2019/07/11 Python
Ubuntu16.04安装python3.6.5步骤详解
2020/01/10 Python
翻转数列python实现,求前n项和,并能输出整个数列的案例
2020/05/03 Python
Mountain Warehouse德国官网:英国户外零售商
2019/08/11 全球购物
接口中的方法可以是abstract的吗
2015/07/23 面试题
GWT都有什么特性
2016/12/02 面试题
2014年优秀班主任工作总结
2014/12/16 职场文书
学生检讨书范文
2015/01/27 职场文书
安全生产奖惩制度
2015/08/06 职场文书
2016年教师反腐倡廉心得体会
2016/01/13 职场文书
创业计划书之少年玩具店
2019/09/05 职场文书
俄罗斯十大城市人口排名,第三首都仅排第六,第二是北方首都
2022/03/20 杂记