python如何控制进程或者线程的个数


Posted in Python onOctober 16, 2020

背景

日常开发中,难免遇到并发场景,而并发场景难免需要做流量控制,即需要对并发的进程或者线程的总量进行控制。 今天简单总结两种常用的控制线程个数的方法。

方法一:进程池/线程池

如下例demo所示, 创建了一个大小是4的进程池,然后创建5个进程,并启动

from multiprocessing import Pool
import os, time, random


def long_time_task(name):
  print('Run task %s (%s)...' % (name, os.getpid()))
  start = time.time()
  time.sleep(random.random() * 3)
  end = time.time()
  print('Task %s runs %0.2f seconds.' % (name, (end - start)))


if __name__ == '__main__':
  print('Parent process %s.' % os.getpid())
  p = Pool(4)
  for i in range(5):
    p.apply_async(long_time_task, args=(i,))
  print('Waiting for all subprocesses done...')
  p.close()
  p.join()
  print('All subprocesses done.')

运行结果如下,可以看到第5个进程会等池子里的进程完成一个后才会被启动

Run task 0 (32952)...
Run task 1 (32951)...
Run task 2 (32953)...
Run task 3 (32954)...
Task 2 runs 0.68 seconds.
Run task 4 (32953)...
Task 1 runs 1.41 seconds.
Task 0 runs 1.44 seconds.
Task 4 runs 2.15 seconds.
Task 3 runs 2.98 seconds.
All subprocesses done.

方法二:queue

queue 模块即队列,特别适合处理信息在多个线程间安全交换的多线程程序中。 下面的demo展示了如何通过queue来限制线程的并发个数

import threading
import queue
import time
import random
import os

maxThreads = 4


class Store(threading.Thread):
  def __init__(self, q):
    threading.Thread.__init__(self)
    self.queue = q
    # self.store = store

  def run(self):
    try:
      print('Run task (%s)...' % (os.getpid()))
      start = time.time()
      time.sleep(random.random() * 3)
      end = time.time()
      t = threading.currentThread()
      # 线程ID
      print('Thread id : %d' % t.ident)
      print('Thread name : %s' % t.getName())
      print('Task runs %0.2f seconds.' % (end - start))
    except Exception as e:
      print(e)
    finally:
      self.queue.get()
      self.queue.task_done()


def main():
  q = queue.Queue(maxThreads)
  for s in range(6):
    q.put(s)
    t = Store(q)
    t.start()
  q.join()
  print('over')


if __name__ == '__main__':
  main()

运行结果如下:

Run task (33259)...
Run task (33259)...
Run task (33259)...
Run task (33259)...
Thread id : 123145444999168
Thread name : Thread-13
Task runs 0.04 seconds.
Run task (33259)...
Thread id : 123145394630656
Thread name : Thread-10
Task runs 1.02 seconds.
Run task (33259)...
Thread id : 123145428209664
Thread name : Thread-12
Task runs 1.20 seconds.
Thread id : 123145394630656
Thread name : Thread-17
Task runs 0.68 seconds.
Thread id : 123145444999168
Thread name : Thread-14
Task runs 1.79 seconds.
Thread id : 123145411420160
Thread name : Thread-11
Task runs 2.96 seconds.
over

以上就是python如何控制进程或者线程的个数的详细内容,更多关于python 控制进程或线程的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
探究Python多进程编程下线程之间变量的共享问题
May 05 Python
python实现搜索指定目录下文件及文件内搜索指定关键词的方法
Jun 28 Python
Python文件的读写和异常代码示例
Oct 31 Python
浅谈python3发送post请求参数为空的情况
Dec 28 Python
python标准库sys和OS的函数使用方法与实例详解
Feb 12 Python
PyCharm 专业版安装图文教程
Feb 20 Python
python mysql 字段与关键字冲突的解决方式
Mar 02 Python
Python unittest框架操作实例解析
Apr 13 Python
什么是python的必选参数
Jun 21 Python
Tensorflow中批量读取数据的案列分析及TFRecord文件的打包与读取
Jun 30 Python
基于python图书馆管理系统设计实例详解
Aug 05 Python
python数据分析之用sklearn预测糖尿病
Apr 22 Python
python利用 keyboard 库记录键盘事件
Oct 16 #Python
python实现快速文件格式批量转换的方法
Oct 16 #Python
Python通过getattr函数获取对象的属性值
Oct 16 #Python
pandas处理csv文件的方法步骤
Oct 16 #Python
python爬取”顶点小说网“《纯阳剑尊》的示例代码
Oct 16 #Python
Python使用内置函数setattr设置对象的属性值
Oct 16 #Python
python pymysql库的常用操作
Oct 16 #Python
You might like
ThinkPHP应用模式扩展详解
2014/07/16 PHP
PHP中使用虚代理实现延迟加载技术
2014/11/05 PHP
PHP类和对象相关系统函数与运算符小结
2016/09/28 PHP
PHP按一定比例压缩图片的方法
2018/10/12 PHP
PDO::query讲解
2019/01/29 PHP
jquery的ajax跨域请求原理和示例
2014/05/08 Javascript
jquery手风琴特效插件
2015/02/04 Javascript
JS实现的竖向折叠菜单代码
2015/10/21 Javascript
JS Attribute属性操作详解
2016/05/19 Javascript
JavaScript实现移动端滑动选择日期功能
2016/06/21 Javascript
JS 拼凑字符串的简单实例
2016/09/02 Javascript
vue生成随机验证码的示例代码
2017/09/29 Javascript
Vue+Webpack完美整合富文本编辑器TinyMce的方法
2018/11/30 Javascript
python中 ? : 三元表达式的使用介绍
2013/10/09 Python
python控制台显示时钟的示例
2014/02/24 Python
Python cookbook(数据结构与算法)字典相关计算问题示例
2018/02/18 Python
pandas pivot_table() 按日期分多列数据的方法
2018/11/16 Python
selenium+python自动化测试之鼠标和键盘事件
2019/01/23 Python
Python中print和return的作用及区别解析
2019/05/05 Python
python写入数据到csv或xlsx文件的3种方法
2019/08/23 Python
Python爬虫库BeautifulSoup获取对象(标签)名,属性,内容,注释
2020/01/25 Python
Python爬取365好书中小说代码实例
2020/02/28 Python
国际领先的学术出版商:Springer
2017/01/11 全球购物
法国高保真音响和家庭影院商店:Son Video
2019/04/26 全球购物
static全局变量与普通的全局变量有什么区别
2014/05/27 面试题
经管应届生求职信
2013/11/17 职场文书
《一件运动衫》教学反思
2014/02/19 职场文书
一份文言文检讨书
2014/09/13 职场文书
机关中层领导干部群众路线教育实践活动个人对照检查材料
2014/09/24 职场文书
领导干部作风整顿个人剖析材料
2014/10/11 职场文书
建党伟业电影观后感
2015/06/01 职场文书
校园之声广播稿
2015/08/18 职场文书
毕业生自我鉴定范文
2019/05/13 职场文书
nginx基于域名,端口,不同IP的虚拟主机设置的实现
2021/03/31 Servers
如何用JS实现简单的数据监听
2021/05/06 Javascript
基于Python绘制子图及子图刻度的变换等的问题
2021/05/23 Python