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数组定义方法
Apr 13 Python
Python实现Logger打印功能的方法详解
Sep 01 Python
python中文乱码不着急,先看懂字节和字符
Dec 20 Python
Python实现爬虫从网络上下载文档的实例代码
Jun 13 Python
python实现海螺图片的方法示例
May 12 Python
Python中新式类与经典类的区别详析
Jul 10 Python
Python使用正则表达式分割字符串的实现方法
Jul 16 Python
Django Rest framework认证组件详细用法
Jul 25 Python
Python使用import导入本地脚本及导入模块的技巧总结
Aug 07 Python
matplotlib绘制多个子图(subplot)的方法
Dec 03 Python
对tensorflow中tf.nn.conv1d和layers.conv1d的区别详解
Feb 11 Python
python利用tkinter实现图片格式转换的示例
Sep 28 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
PHP与javascript的两种交互方式
2006/10/09 PHP
坏狼的PHP学习教程之第2天
2008/06/15 PHP
ThinkPHP实现二级循环读取的方法
2014/11/03 PHP
WordPress中用于更新伪静态规则的PHP代码实例讲解
2015/12/18 PHP
thinkPHP框架中执行事务的方法示例
2018/05/31 PHP
PHP反射学习入门示例
2019/06/14 PHP
JS 时间显示效果代码
2009/08/23 Javascript
js动态删除div元素基本思路及实现代码
2014/05/08 Javascript
JavaScript实现快速排序的方法
2015/07/31 Javascript
Bootstrap模仿起筷首页效果
2016/05/09 Javascript
jQuery的$.extend 浅拷贝与深拷贝
2017/03/08 Javascript
Angular获取手机验证码实现移动端登录注册功能
2017/05/17 Javascript
简单实现js上传文件功能
2017/08/21 Javascript
微信小程序实现多宫格抽奖活动
2020/04/15 Javascript
微信小程序form表单组件示例代码
2018/07/15 Javascript
JavaScript如何实现元素全排列实例代码
2019/05/14 Javascript
微信小程序实现form表单本地储存数据
2019/06/27 Javascript
JS实现判断移动端PC端功能
2020/02/21 Javascript
js实现金山打字通小游戏
2020/07/24 Javascript
简介JavaScript错误处理机制
2020/08/04 Javascript
利用python求解物理学中的双弹簧质能系统详解
2017/09/29 Python
python 在指定范围内随机生成不重复的n个数实例
2019/01/28 Python
Django时区详解
2019/07/24 Python
Python assert语句的简单使用示例
2019/07/28 Python
Django ORM 聚合查询和分组查询实现详解
2019/08/09 Python
Python协程操作之gevent(yield阻塞,greenlet),协程实现多任务(有规律的交替协作执行)用法详解
2019/10/14 Python
浅析css3中matrix函数的使用
2016/06/06 HTML / CSS
详解CSS3新增的背景属性
2019/12/25 HTML / CSS
网络技术支持面试题
2013/04/22 面试题
EJB3.1都有哪些改进
2012/11/17 面试题
物流管理毕业生自荐信范文
2014/03/15 职场文书
学校校庆演讲稿
2014/05/22 职场文书
共青团员自我评价范文
2014/09/14 职场文书
公司人事管理制度
2015/08/05 职场文书
数据结构课程设计心得体会
2016/01/15 职场文书
《我和小伙伴》教学反思
2016/02/20 职场文书