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

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确实多核在交替进行啊

文章转载自 开源中国社区[https://www.oschina.net]

时间: 2024-11-03 17:54:43

Python控制多进程与多线程并发数的相关文章

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

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

python并发编程之多进程、多线程、异步和协程详解_python

最近学习python并发,于是对多进程.多线程.异步和协程做了个总结.一.多线程 多线程就是允许一个进程内存在多个控制权,以便让多个函数同时处于激活状态,从而让多个函数的操作同时运行.即使是单CPU的计算机,也可以通过不停地在不同线程的指令间切换,从而造成多线程同时运行的效果. 多线程相当于一个并发(concunrrency)系统.并发系统一般同时执行多个任务.如果多个任务可以共享资源,特别是同时写入某个变量的时候,就需要解决同步的问题,比如多线程火车售票系统:两个指令,一个指令检查票是否卖完,

浅析Python中的多进程与多线程的使用_python

在批评Python的讨论中,常常说起Python多线程是多么的难用.还有人对 global interpreter lock(也被亲切的称为"GIL")指指点点,说它阻碍了Python的多线程程序同时运行.因此,如果你是从其他语言(比如C++或Java)转过来的话,Python线程模块并不会像你想象的那样去运行.必须要说明的是,我们还是可以用Python写出能并发或并行的代码,并且能带来性能的显著提升,只要你能顾及到一些事情.如果你还没看过的话,我建议你看看Eqbal Quran的文章

并发服务器的实现如何选择多进程,多线程还是IO复用

问题描述 并发服务器的实现如何选择多进程,多线程还是IO复用 在实现并发服务器时可以考虑多种情景进而对使用技术进行选择,如处理实现,IO时间,DDoS攻击等,如何根据这些特点选择使用多进程还是多线程还是IO复用呢?希望大牛在此一游,给小弟解答一下.

【Python之旅】第五篇(三):Python Socket多线程并发

 前面的几个例子都是单线程的,下面再来说说多线程的. 1.多线程模块     主要是socketserver模块,如下图示: 2.多线程原理     如下图示说明: 3.SockteServer例子说明 服务器端: 客户端: 4.演示     还是以前面例子,对代码进行修改,作如下的演示. Server端: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import SocketServer            #导入SocketServer,

多线程-【JAVA】对外提供servlet接口,怎样提高并发数

问题描述 [JAVA]对外提供servlet接口,怎样提高并发数 系统对外提供servlet接口,但是遇到并发量大时,会报connection time out或者其他错误,分析是并发数大造成的(并发约100).想请教大家如何能提高性能. 我现在web和DB都做了集群,同时也使用了反向代理.我是不是要改变一下对外提供的接口方式呢,或者使用多线程什么的,希望大家畅所欲言 解决方案 100这也太少...是不是业务逻辑有问题.

Python标准库08 多线程与同步 (threading包)

原文:Python标准库08 多线程与同步 (threading包) 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢!   Python主要通过标准库中的threading包来实现多线程.在当今网络时代,每个服务器都会接收到大量的请求.服务器可以利用多线程的方式来处理这些请求,以提高对网络端口的读写效率.Python是一种网络服务器的后台工作语言 (比如豆瓣网),所以多线程也就很自然被Python语言支持. (关于多线程的原理和

APACHE中限制IP连接数与IP并发数和流量控制

  利用Limit模块限制IP连接数 系统版本:centos6.3 APACHE版本:apache2.42(编译安装) 1.配置Limit模块 #wget http://dominia.org/djao/limit/mod_limitipconn-0.24.tar.bz2 安装: #tar jxvf mod_limitipconn-0.24.tar.bz2 #cd mod_limitipconn-0.24 #vi Makefile 找到APXS这行,改成 APXS=/usr/local/apac

银行取款[多线程]{未进行线程同步}(junit不适合多线程并发单元测试)

        由于计算机多任务.多进程.多线程的支持,使得计算机资源的服务效率提高,服务器对请求的也使用线程来相应,所有,代码中涉及到同时对共享数据的操作,将在 多线程环境中操作数据,导致数据安全问题.      经典例子:老婆(朱丽叶)老公(罗密欧),使用银行卡和存折,或者网银等,同时对同一账户操作的安全问题.      如果要保证多线程下数据安全,就要实现线程同步(例如:一间小厕所,就得有一个锁,保证同一时间为一个人服务).其他文章讲: 此处用多线程实现,同时取款的模拟实现,未进行线程同步