1. #coding: utf-8
  2. #!/usr/bin/env python
  3. import Queue
  4. import threading
  5. import time
  6.  
  7. prolock = threading.Lock()
  8.  
  9. # 定义同时队列数
  10. queue = Queue.Queue(maxsize=10)
  11.  
  12. # 定义任务初值值及最大值
  13. taskidx = 0
  14. maxidx = 100
  15.  
  16. # 生成任务列表
  17. def taskList():
  18. task = []
  19. for i in range(100):
  20. task.append("task" + str(i))
  21. return task
  22.  
  23. # 把任务放入队列中
  24. class Producer(threading.Thread):
  25. def __init__(self, name, queue):
  26. self.__name = name
  27. self.__queue = queue
  28. super(Producer, self).__init__()
  29.  
  30. def run(self):
  31. while True:
  32. global taskidx, prolock, maxidx
  33. time.sleep(4)
  34. prolock.acquire()
  35. print 'Producer name: %s' % (self.__name)
  36. if maxidx == taskidx:
  37. prolock.release()
  38. break
  39. ips = taskList()
  40. ip = ips[taskidx]
  41. self.__queue.put(ip)
  42. taskidx = taskidx + 1
  43. prolock.release()
  44.  
  45. # 线程处理任务
  46. class Consumer(threading.Thread):
  47. def __init__(self, name, queue):
  48. self.__name = name
  49. self.__queue = queue
  50. super(Consumer, self).__init__()
  51.  
  52. def run(self):
  53. while True:
  54. ip = self.__queue.get()
  55. print 'Consumer name: %s' % (self.__name)
  56. consumer_process(ip)
  57. self.__queue.task_done()
  58.  
  59. def consumer_process(ip):
  60. time.sleep(1)
  61. print ip
  62.  
  63. def startProducer(thread_num):
  64. t_produce = []
  65. for i in range(thread_num):
  66. p = Producer("producer"+str(i), queue)
  67. p.setDaemon(True)
  68. p.start()
  69. t_produce.append(p)
  70. return t_produce
  71.  
  72. def startConsumer(thread_num):
  73. t_consumer = []
  74. for i in range(thread_num):
  75. c = Consumer("Consumer"+str(i), queue)
  76. c.setDaemon(True)
  77. c.start()
  78. t_consumer.append(c)
  79. return t_consumer
  80.  
  81. def main():
  82. t_produce = startProducer(3)
  83. t_consumer = startConsumer(5)
  84.  
  85. # 确保所有的任务都生成
  86. for p in t_produce:
  87. p.join()
  88.  
  89. # 等待处理完所有任务
  90. queue.join()
  91.  
  92. if __name__ == '__main__':
  93. main()
  94. print '------end-------'

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

  1. #coding: utf-8
  2. #!/usr/bin/env python
  3. import Queue
  4. import threading
  5. import time
  6.  
  7. # 定义同时处理任务数
  8. queue = Queue.Queue(maxsize=3)
  9.  
  10. # 生成任务列表
  11. def taskList():
  12. task = []
  13. for i in range(100):
  14. task.append("task" + str(i))
  15. return task
  16.  
  17. # 把任务放入队列中
  18. class Producer(threading.Thread):
  19. def __init__(self, name, queue):
  20. self.__name = name
  21. self.__queue = queue
  22. super(Producer, self).__init__()
  23.  
  24. def run(self):
  25. for ip in taskList():
  26. self.__queue.put(ip)
  27.  
  28. # 线程处理任务
  29. class Consumer(threading.Thread):
  30. def __init__(self, name, queue):
  31. self.__name = name
  32. self.__queue = queue
  33. super(Consumer, self).__init__()
  34.  
  35. def run(self):
  36. while True:
  37. ip = self.__queue.get()
  38. print 'Consumer name: %s' % (self.__name)
  39. consumer_process(ip)
  40. self.__queue.task_done()
  41.  
  42. def consumer_process(ip):
  43. time.sleep(1)
  44. print ip
  45.  
  46. def startConsumer(thread_num):
  47. t_consumer = []
  48. for i in range(thread_num):
  49. c = Consumer(i, queue)
  50. c.setDaemon(True)
  51. c.start()
  52. t_consumer.append(c)
  53. return t_consumer
  54.  
  55. def main():
  56. p = Producer("Producer task0", queue)
  57. p.setDaemon(True)
  58. p.start()
  59. startConsumer(9)
  60.  
  61. # 确保所有的任务都生成
  62. p.join()
  63.  
  64. # 等待处理完所有任务
  65. queue.join()
  66.  
  67. if __name__ == '__main__':
  68. main()
  69. 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. C#的改进特性

    1.初始器 当你新建一个对象实例的时候,是否遇到下面这种情况: class a = new class(); a.item1 = "; a.item2 = "; 或者写一个构造函数 ...

  2. Linq学习(主要参考linq之路)----2LINQ方法语法

    方法语法:Fluent Syntax 方法语法是非常灵活和重要的.我们这里讲描述使用连接查询运算符的方式来创建复杂的子查询,方法语法的本质是通过扩展方法和Lambda表达式来创建查询. eg1: st ...

  3. 没有选择上传的文件或选择的文件大小超出大小(DEDECMS亲身试验成功)

    dedecms升级到5.7后,后台上传压缩包文件,提示"没有选择上传的文件或选择的文件大小超出大小",由于很久都没弄这个系统了,所以最早怎么设置的也忘记了,就上百度搜,基本上有说的 ...

  4. ios - 如何获取app上的数据

    做过ios开发的人应该都用过Charles,通常叫它花瓶.Charles是Mac下常用的对网络流量进行分析的工具,类似于Windows下的Fiddler.在开发iOS程序的时候,往往需要调试客户端和服 ...

  5. Angular CLI: 发布到 GitHub Pages

    发布 Angular 应用的简单方式是使用 GitHub Pages. 首先需要创建一个 GitHub 账号,随后,为您的项目创建一个仓库.记下 GitHub 中的用户名和项目名称. 例如,我的 Gi ...

  6. SQLite学习手册(实例代码<一>)

    一.获取表的Schema信息:       1). 动态创建表.     2). 根据sqlite3提供的API,获取表字段的信息,如字段数量以及每个字段的类型.     3). 删除该表.     ...

  7. MongDB .Net工具库MongoRepository的简单使用

    MongDB .Net工具库MongoRepository的简单使用 最近研究了一下MongoDB数据库,并使用了开源的在.net环境下的一个类库,Mongo仓库.对于数据的一些简单的操作非常好用,特 ...

  8. /dev/shm 引起的内存统计问题

    最近,有个同事问我,怎么准确地描述linux系统到底还有多少内存可供我使用.这里不扯内存碎片问题,就说剩余总量. 如下: cat /proc/meminfo MemTotal: 263796812 k ...

  9. P1361 小M的作物

    P1361 小M的作物 题目描述 小M在MC里开辟了两块巨大的耕地A和B(你可以认为容量是无穷),现在,小P有n中作物的种子,每种作物的种子有1个(就是可以种一棵作物)(用1...n编号). 现在,第 ...

  10. javascript对象的标签

    [[proto]]标签 [[class]]标签 [[class]] 标签,代表这对象是哪个类型的.在js中不能直接访问到.可以通过Object.prototype.toString.call(obj) ...