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去掉字符串中空格的方法
Mar 11 Python
Python和Perl绘制中国北京跑步地图的方法
Mar 03 Python
Flask模板引擎之Jinja2语法介绍
Jun 26 Python
pyinstaller打包opencv和numpy程序运行错误解决
Aug 16 Python
Python Django 简单分页的实现代码解析
Aug 21 Python
python实现多线程端口扫描
Aug 31 Python
pandas数据处理进阶详解
Oct 11 Python
Python Django2.0集成Celery4.1教程
Nov 19 Python
解决tensorflow由于未初始化变量而导致的错误问题
Jan 06 Python
python使用梯度下降和牛顿法寻找Rosenbrock函数最小值实例
Apr 02 Python
如何对python的字典进行排序
Jun 19 Python
利用python实时刷新基金估值(摸鱼小工具)
Sep 15 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
一个简单的自动发送邮件系统(三)
2006/10/09 PHP
hessian 在PHP中的使用介绍
2010/12/13 PHP
php 归并排序 数组交集
2011/05/10 PHP
php批量添加数据与批量更新数据的实现方法
2014/12/16 PHP
PHP类的自动加载机制实现方法分析
2019/01/10 PHP
学习YUI.Ext 第六天--关于树TreePanel(Part 2异步获取节点)
2007/03/10 Javascript
JS的replace方法详细介绍
2012/11/09 Javascript
JavaScript获取表格(table)当前行的值、删除行、增加行
2015/07/03 Javascript
JavaScript实现对下拉列表值进行排序的方法
2015/07/15 Javascript
js仿QQ中对联系人向左滑动、滑出删除按钮的操作
2016/04/07 Javascript
微信小程序中form 表单提交和取值实例详解
2017/04/20 Javascript
vue二级路由设置方法
2018/02/09 Javascript
在vue中获取token,并将token写进header的方法
2018/09/26 Javascript
详解a标签添加onclick事件的几种方式
2019/03/29 Javascript
详解微信小程序调用支付接口支付
2019/04/28 Javascript
Vue+Element-UI实现上传图片并压缩
2019/11/26 Javascript
微信公众号中的JSSDK接入及invalid signature等常见错误问题分析(全面解析)
2020/04/11 Javascript
[45:06]完美世界DOTA2联赛PWL S2 Magma vs InkIce 第二场 11.28
2020/12/02 DOTA
Python中使用Tkinter模块创建GUI程序实例
2015/01/14 Python
Python读写Json涉及到中文的处理方法
2016/09/12 Python
TensorFlow实现RNN循环神经网络
2018/02/28 Python
python中利用h5py模块读取h5文件中的主键方法
2018/06/05 Python
Numpy之random函数使用学习
2019/01/29 Python
python3.6下Numpy库下载与安装图文教程
2019/04/02 Python
Pythony运维入门之Socket网络编程详解
2019/04/15 Python
python导入pandas具体步骤方法
2019/06/23 Python
使用OpenCV实现仿射变换—旋转功能
2019/08/29 Python
详解Python在使用JSON时需要注意的编码问题
2019/12/06 Python
使用Keras中的ImageDataGenerator进行批次读图方式
2020/06/17 Python
HTML5 canvas基本绘图之绘制五角星
2016/06/27 HTML / CSS
澳大利亚先进的皮肤和激光诊所购物网站:Soho Skincare
2018/10/15 全球购物
质量保证书
2015/01/17 职场文书
学校青年志愿者活动总结
2015/05/06 职场文书
2019通用版新员工入职培训方案!
2019/07/11 职场文书
浅谈MySQL user权限表
2021/06/18 MySQL
golang内置函数len的小技巧
2021/07/25 Golang