#coding: utf-8
#!/usr/bin/env python
import Queue
import threading
import time prolock = threading.Lock() # 定义同时队列数
queue = Queue.Queue(maxsize=10) # 定义任务初值值及最大值
taskidx = 0
maxidx = 100 # 生成任务列表
def taskList():
task = []
for i in range(100):
task.append("task" + str(i))
return task # 把任务放入队列中
class Producer(threading.Thread):
def __init__(self, name, queue):
self.__name = name
self.__queue = queue
super(Producer, self).__init__() def run(self):
while True:
global taskidx, prolock, maxidx
time.sleep(4)
prolock.acquire()
print 'Producer name: %s' % (self.__name)
if maxidx == taskidx:
prolock.release()
break
ips = taskList()
ip = ips[taskidx]
self.__queue.put(ip)
taskidx = taskidx + 1
prolock.release() # 线程处理任务
class Consumer(threading.Thread):
def __init__(self, name, queue):
self.__name = name
self.__queue = queue
super(Consumer, self).__init__() def run(self):
while True:
ip = self.__queue.get()
print 'Consumer name: %s' % (self.__name)
consumer_process(ip)
self.__queue.task_done() def consumer_process(ip):
time.sleep(1)
print ip def startProducer(thread_num):
t_produce = []
for i in range(thread_num):
p = Producer("producer"+str(i), queue)
p.setDaemon(True)
p.start()
t_produce.append(p)
return t_produce def startConsumer(thread_num):
t_consumer = []
for i in range(thread_num):
c = Consumer("Consumer"+str(i), queue)
c.setDaemon(True)
c.start()
t_consumer.append(c)
return t_consumer def main():
t_produce = startProducer(3)
t_consumer = startConsumer(5) # 确保所有的任务都生成
for p in t_produce:
p.join() # 等待处理完所有任务
queue.join() if __name__ == '__main__':
main()
print '------end-------'

一般生成任务都会比较快,可以使用单线程来生成任务,示例如下:

#coding: utf-8
#!/usr/bin/env python
import Queue
import threading
import time # 定义同时处理任务数
queue = Queue.Queue(maxsize=3) # 生成任务列表
def taskList():
task = []
for i in range(100):
task.append("task" + str(i))
return task # 把任务放入队列中
class Producer(threading.Thread):
def __init__(self, name, queue):
self.__name = name
self.__queue = queue
super(Producer, self).__init__() def run(self):
for ip in taskList():
self.__queue.put(ip) # 线程处理任务
class Consumer(threading.Thread):
def __init__(self, name, queue):
self.__name = name
self.__queue = queue
super(Consumer, self).__init__() def run(self):
while True:
ip = self.__queue.get()
print 'Consumer name: %s' % (self.__name)
consumer_process(ip)
self.__queue.task_done() def consumer_process(ip):
time.sleep(1)
print ip def startConsumer(thread_num):
t_consumer = []
for i in range(thread_num):
c = Consumer(i, queue)
c.setDaemon(True)
c.start()
t_consumer.append(c)
return t_consumer def main():
p = Producer("Producer task0", queue)
p.setDaemon(True)
p.start()
startConsumer(9) # 确保所有的任务都生成
p.join() # 等待处理完所有任务
queue.join() if __name__ == '__main__':
main()
print '------end-------'

python多线程限制并发数示例的更多相关文章

  1. golang与python多线程的并发速度

    一.golang的代码 package main import ( "fmt" "time" ) func Text_goroute(a int, b int) ...

  2. python多线程,限制线程数

    #encoding:utf8 import threading import time data = 0 def func(sleeptime): global data print threadin ...

  3. Python 多线程教程:并发与并行

    转载于: https://my.oschina.net/leejun2005/blog/398826 在批评Python的讨论中,常常说起Python多线程是多么的难用.还有人对 global int ...

  4. python 多线程示例

    原文链接:http://www.cnblogs.com/whatisfantasy/p/6440585.html 1 概念梳理: 1.1 线程 1.1.1 什么是线程 线程是操作系统能够进行运算调度的 ...

  5. 百万年薪python之路 -- 并发编程之 多线程 二

    1. 死锁现象与递归锁 进程也有死锁与递归锁,进程的死锁和递归锁与线程的死锁递归锁同理. 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因为争夺资源而造成的一种互相等待的现象,在无外力的作用 ...

  6. python多线程爬虫设计及实现示例

    爬虫的基本步骤分为:获取,解析,存储.假设这里获取和存储为io密集型(访问网络和数据存储),解析为cpu密集型.那么在设计多线程爬虫时主要有两种方案:第一种方案是一个线程完成三个步骤,然后运行多个线程 ...

  7. 利用Python多线程来测试并发漏洞

    需求介绍 有时候想看看Web应用在代码或者数据库层有没有加锁,比如在一些支付.兑换类的场景,通过多线程并发访问的测试方式可以得到一个结论. 步骤 1. Burp Suite安装插件 安装一个Copy ...

  8. (CSDN迁移) JAVA多线程实现-可控最大并发数线程池(newFixedThreadPool)

    上篇文章中介绍了单线程化线程池newSingleThreadExecutor,可控最大并发数线程池(newFixedThreadPool)与其最大的区别是可以通知执行多个线程,可以简单的将newSin ...

  9. 用Queue控制python多线程并发数量

    python多线程如果不进行并发数量控制,在启动线程数量多到一定程度后,会造成线程无法启动的错误. 下面介绍用Queue控制多线程并发数量的方法(python3). # -*- coding: utf ...

随机推荐

  1. CTF---Web入门第五题 貌似有点难

    貌似有点难分值:20 来源: 西普学院 难度:难 参与人数:7249人 Get Flag:2519人 答题人数:2690人 解题通过率:94% 不多说,去看题目吧. 解题链接: http://ctf5 ...

  2. hihoCoder #1043 : 完全背包(板子题)

    #1043 : 完全背包 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 且说之前的故事里,小Hi和小Ho费劲心思终于拿到了茫茫多的奖券!而现在,终于到了小Ho领取奖励的 ...

  3. [bzoj 2017] [Usaco2009 Nov]硬币游戏

    一个多月没更博客了..(期间明白了自己有多傻逼. 这种问题大概就倒着做... f[i][j]:表示考虑剩下的硬币i..n,且之前的人取了j个时,先手最多拿到的钱数.aft[i]:表示硬币i..n的总钱 ...

  4. $(function(){...});的作用

    这是JQuery的语法,$表示JQuery对象,可以有好几种用法.比如传递选择器字符串.页面对象等,如果直接传函数体进去,表示网页加载完毕后要执行的意思.和JAVASCRIPT原来的这个是一样的: w ...

  5. linux(CENTOS)系统各个目录的作用详解

    Linux(CentOS)系统各个目录的作用详解 文件的类型 LINUX有四种基本文件系统类型:普通文件.目录文件.连接文件和特殊文件,可用file命令来识别. 普通文件:如文本文件.C语言元代码.S ...

  6. Flume环境搭建_五种案例

    Flume环境搭建_五种案例 http://flume.apache.org/FlumeUserGuide.html A simple example Here, we give an example ...

  7. 从零开始学习前端开发 — 9、标签嵌套规则及CSS常用样式覆盖

    1. 块级元素可以包含内联元素或某些块级元素,但内联元素却不能包含块级元素,它只能包含其它的内联元素: <div><h1></h1><p></p& ...

  8. for循环,数组

    for (var a=0; a<10; a++ ) for循环 声明a为0 循环a=9时(10次) 每循环一次a的值+1; { 循环体 } var a=Attr();var a=[];数组; / ...

  9. PHP正则式PCRE

    PHP正则式PCRE的总结差不多就下边这些了.参考 PCRE与perl的差异 .   锚(^.$.\A.\Z/\z):^.$在多行模式下是非紧固的,在单行模式下是紧固的:而\A.\Z / \z在任何模 ...

  10. sqlite入门基础(一):sqlite3_open,sqlite3_exec,slite3_close

    打开数据库链接sqlite3_open用法 原型: int sqlite3_open( const char *filename, /* Database filename (UTF-8) */ sq ...