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 Shell获取hostname和fqdn释疑
Jan 25 Python
Python正则抓取新闻标题和链接的方法示例
Apr 24 Python
Django 实现下载文件功能的示例
Mar 06 Python
python 返回列表中某个值的索引方法
Nov 07 Python
对Python实现简单的API接口实例讲解
Dec 10 Python
Python中GeoJson和bokeh-1的使用讲解
Jan 03 Python
Python实现查找字符串数组最长公共前缀示例
Mar 27 Python
python中的decimal类型转换实例详解
Jun 26 Python
Python 迭代,for...in遍历,迭代原理与应用示例
Oct 12 Python
python查看数据类型的方法
Oct 12 Python
Python应用实现双指数函数及拟合代码实例
Jun 19 Python
Python安装并操作redis实现流程详解
Oct 13 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
使用Xdebug调试和优化PHP程序之[1]
2007/04/17 PHP
php 实现进制转换(二进制、八进制、十六进制)互相转换实现代码
2010/10/22 PHP
基于PHPExcel的常用方法总结
2013/06/13 PHP
php传值方式和ajax的验证功能
2017/03/27 PHP
php+mysql开发中的经验与常识小结
2019/03/25 PHP
jQuery UI的Dialog无法提交问题的解决方法
2011/01/11 Javascript
javascript 模拟坦克大战游戏(html5版)附源码下载
2014/04/08 Javascript
jQuery中siblings()方法用法实例
2015/01/08 Javascript
Javascript将JSON日期格式化
2016/08/23 Javascript
React-Native 组件之 Modal的使用详解
2017/08/08 Javascript
Express系列之multer上传的使用
2017/10/27 Javascript
浅谈使用React.setState需要注意的三点
2017/12/18 Javascript
JS随机数产生代码分享
2018/02/24 Javascript
自定义javascript验证框架示例【附源码下载】
2019/05/31 Javascript
Vue 用Vant实现时间选择器的示例代码
2019/10/25 Javascript
jQuery带控制按钮轮播图插件
2020/07/31 jQuery
Python六大开源框架对比
2015/10/19 Python
python文件与目录操作实例详解
2016/02/22 Python
python 把文件中的每一行以数组的元素放入数组中的方法
2018/04/29 Python
Python实现读取txt文件并转换为excel的方法示例
2018/05/17 Python
在PyCharm中控制台输出日志分层级分颜色显示的方法
2019/07/11 Python
Ubuntu+python将nii图像保存成png格式
2019/07/18 Python
使用Python将图片转正方形的两种方法实例代码详解
2020/04/29 Python
Python getattr()函数使用方法代码实例
2020/08/10 Python
Python爬虫之Selenium实现键盘事件
2020/12/04 Python
澳大利亚新奇小玩意网站:Yellow Octopus
2017/12/28 全球购物
利达恒信公司.NET笔试题面试题
2016/03/05 面试题
党的群众路线教育实践活动宣传方案
2014/02/23 职场文书
汽车促销活动方案
2014/03/31 职场文书
常务副总经理任命书
2014/06/05 职场文书
老干部工作汇报材料
2014/10/28 职场文书
2014年小学教研工作总结
2014/12/06 职场文书
杜甫草堂导游词
2015/02/03 职场文书
大学开学典礼新闻稿
2015/07/17 职场文书
婚前协议书怎么写,才具有法律效力呢 ?
2019/06/28 职场文书
python 通过使用Yolact训练数据集
2021/04/06 Python