python多线程限制并发数示例
#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多线程限制并发数示例的更多相关文章
- golang与python多线程的并发速度
一.golang的代码 package main import ( "fmt" "time" ) func Text_goroute(a int, b int) ...
- python多线程,限制线程数
#encoding:utf8 import threading import time data = 0 def func(sleeptime): global data print threadin ...
- Python 多线程教程:并发与并行
转载于: https://my.oschina.net/leejun2005/blog/398826 在批评Python的讨论中,常常说起Python多线程是多么的难用.还有人对 global int ...
- python 多线程示例
原文链接:http://www.cnblogs.com/whatisfantasy/p/6440585.html 1 概念梳理: 1.1 线程 1.1.1 什么是线程 线程是操作系统能够进行运算调度的 ...
- 百万年薪python之路 -- 并发编程之 多线程 二
1. 死锁现象与递归锁 进程也有死锁与递归锁,进程的死锁和递归锁与线程的死锁递归锁同理. 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因为争夺资源而造成的一种互相等待的现象,在无外力的作用 ...
- python多线程爬虫设计及实现示例
爬虫的基本步骤分为:获取,解析,存储.假设这里获取和存储为io密集型(访问网络和数据存储),解析为cpu密集型.那么在设计多线程爬虫时主要有两种方案:第一种方案是一个线程完成三个步骤,然后运行多个线程 ...
- 利用Python多线程来测试并发漏洞
需求介绍 有时候想看看Web应用在代码或者数据库层有没有加锁,比如在一些支付.兑换类的场景,通过多线程并发访问的测试方式可以得到一个结论. 步骤 1. Burp Suite安装插件 安装一个Copy ...
- (CSDN迁移) JAVA多线程实现-可控最大并发数线程池(newFixedThreadPool)
上篇文章中介绍了单线程化线程池newSingleThreadExecutor,可控最大并发数线程池(newFixedThreadPool)与其最大的区别是可以通知执行多个线程,可以简单的将newSin ...
- 用Queue控制python多线程并发数量
python多线程如果不进行并发数量控制,在启动线程数量多到一定程度后,会造成线程无法启动的错误. 下面介绍用Queue控制多线程并发数量的方法(python3). # -*- coding: utf ...
随机推荐
- struts2(六)之ognl表达式与ActionContext、ValueStack
前言 前面已经把struts2讲内容说了一半了,我写的很详细,希望对博友们有帮助. 一.OGNL表达式语言概述 1.1.OGNL表达式简介 百度上是这样说: OGNL是Object-Graph Nav ...
- 开发问题(一)在windows和linux端口占用问题
前言 今天在MyEclipse中使用tomcat发现tomcat端口8080竟然被占用了,所以就找了一下解决办法共参考! 在网络程序的调试过程中,经常发生一些出乎意料的事情,比如创建一个TCP服务失败 ...
- 51 Nod 1027 大数乘法【Java大数乱搞】
1027 大数乘法 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 给出2个大整数A,B,计算A*B的结果. Input 第1行:大数A 第2行:大数B (A,B的长度 ...
- HDU1114Piggy-Bank(完全背包)
Piggy-Bank Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...
- HDU_5563Clarke and five-pointed star
Clarke and five-pointed star Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K ( ...
- spring的applicationContext.xml没有自动提示(使用本地的文档)
http://www.springframework.org/schema/beans/spring-beans.xsd Window>>preference>>搜索xml(X ...
- vuex的使用
vue现在越来越火,不单单可以写简单的小项目,也可以写大中型的项目.但是项目大了,项目之间的数据传递就会变得复杂,那么问题来了?在一个大型项目中,多个组件要公用同一个或多个数据,我们如何保证每个组件获 ...
- TP5 中实现支付宝支付 利用model层调用支付宝类库
<?php /** * Created by PhpStorm. * User: admin * Date: 2017/8/16 * Time: 09:16 */ namespace app\a ...
- DALI 2.0解码模块
DALI2.0调光解码模块使用手册 一.概述(联系人:张先生,电话:13923882807,QQ:813267849) 欢迎使用本公司的DALI 2.0解码模块,该模块支持"DALI第二套协 ...
- J.U.C FutureTask之源码解析
通过直接继承Thread, 实现Runnable接口来创建线程.但这两种方式都有一种缺陷:在执行完任务之后无法获得执行结果. 如果需要获得执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果, ...