文档章节

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

张豪飞
 张豪飞
发布于 2015/10/24 18:13
字数 1528
阅读 7372
收藏 188

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

0x01    前言

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

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

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

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

    进程并行或者线程并行

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

    忘记说了,看留言才想起来,这里贴出了两种方法是为了理解两种的区别和相同点,但是讨论的是python,python是又全局解释器锁(GIL),他会将进程中的线程序列化,也就多核cpu实际上并不能达到并行提高速度的目的,而使用多进程则是不受限的,所以实际应用中都是推荐多进程的,也就是第一种,简单又高效,下面多线程可以作为对比(参考文章)

0x02    进程处理方法

#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是在迭代创建每个进程

输出:

0x03    线程处理方法:

#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 2.7上用多线程开死循环简单看下cpu确实多核在交替进行啊

© 著作权归作者所有

张豪飞
粉丝 30
博文 42
码字总数 21538
作品 0
郑州
程序员
私信 提问
加载中

评论(8)

A
Arckman

引用来自“jQer”的评论

脚本就不要玩线程了。你想用并行提升性能?那不要用脚本语言。你想提高并发效率?用单线程多路复用+非阻塞。

多路复用具体是指什么?
张豪飞
张豪飞 博主
大牛忽喷,我也是刚接触python,想要学线程进程网上资料难找或者对于新手不够通俗易懂,这是希望后来者不要跟我一样走很多弯路。也希望能有大神能带小弟
jQer
jQer
脚本就不要玩线程了。你想用并行提升性能?那不要用脚本语言。你想提高并发效率?用单线程多路复用+非阻塞。
Altman
Altman
python的多线程用都不用,直接多进程或者event loop
导演我躺哪
CPU密集的逻辑就不要想着GIL下的thread了。
Raymin
Raymin
拿一个伪线程的语言谈线程。
a
appjack
楼上正解
每天多一点
每天多一点
CPython的线程并行在这种应用场景下有意义吗?因为是全局锁的存在,似乎是不到预想的作用
(转载)Python进阶:聊聊IO密集型任务、计算密集型任务,以及多线程、多进程 - 笑虎的文章 - 知乎

Python进阶:聊聊IO密集型任务、计算密集型任务,以及多线程、多进程 - 笑虎的文章 - 知乎 https://zhuanlan.zhihu.com/p/24283040 Python进阶:聊聊IO密集型任务、计算密集型任务,以及多线...

avatus
2018/09/05
0
0
Python的进程、线程、协程

从操作系统角度 操作系统处理任务,调度单位是进程和线程。 进程:表示一个程序的执行活动(打开程序、读写程序数据、关闭程序) 线程:执行某个程序时,该进程调度的最小执行单位(执行功能...

快乐水
2018/07/17
0
0
Python 进程线程协程 GIL 闭包 与高阶函数(五)

1 GIL线程全局锁 线程全局锁(Global Interpreter Lock),即Python为了保证线程安全而采取的独立线程运行的限制,说白了就是一个核只能在同一时间运行一个线程.对于io密集型任务,python的多线程...

善良小郎君
2018/06/20
0
0
《Python分布式计算》 第3章 Python的并行计算 (Distributed Computing with Python)

序言 第1章 并行和分布式计算介绍 第2章 异步编程 第3章 Python的并行计算 第4章 Celery分布式应用 第5章 云平台部署Python 第6章 超级计算机群使用Python 第7章 测试和调试分布式应用 第8章...

seancheney
2017/10/13
0
0
python自动化运维之多线程

1、Python中的多线程 执行一个程序,即在操作系统中开启了一个进程,在某一时刻,一个CPU内核只能进行一个进程的任务,现在的计算机所说的多进程/多任务其实是通过加快CPU的执行速度来实现的...

炫维
2018/06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

最简单的获取相机拍照的图片

  import android.content.Intent;import android.graphics.Bitmap;import android.os.Bundle;import android.os.Environment;import android.provider.MediaStore;import andr......

MrLins
今天
5
0
说好不哭!数据可视化深度干货,前端开发下一个涨薪点在这里~

随着互联网在各行各业的影响不断深入,数据规模越来越大,各企业也越来越重视数据的价值。作为一家专业的数据智能公司,个推从消息推送服务起家,经过多年的持续耕耘,积累沉淀了海量数据,在...

个推
今天
8
0
第三方支付-返回与回调注意事项

不管是支付宝,微信,还是其它第三方支付,第四方支付,支付机构服务商只要涉及到钱的交易都要进行如下校验,全部成功了才视为成功订单 1.http请求是否成功 2.校验商户号 3.校验订单号及状态...

Shingfi
今天
4
0
简述Java内存分配和回收策略以及Minor GC 和 Major GC(Full GC)

内存分配: 1. 栈区:栈可分为Java虚拟机和本地方法栈 2. 堆区:堆被所有线程共享,在虚拟机启动时创建,是唯一的目的是存放对象实例,是gc的主要区域。通常可分为两个区块年轻代和年老代。更...

DustinChan
今天
6
0
Excel插入批注:可在批注插入文字、形状、图片

1.批注一直显示:审阅选项卡-------->勾选显示批注选项: 2.插入批注快捷键:Shift+F2 组合键 3.在批注中插入图片:鼠标右键点击批注框的小圆点【重点不可以在批注文本框内点击】----->调出批...

东方墨天
今天
6
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部