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数据库操作常用功能使用详解(创建表/插入数据/获取数据)
Dec 06 Python
用Python进行行为驱动开发的入门教程
Apr 23 Python
python读取文本中数据并转化为DataFrame的实例
Apr 10 Python
Python爬虫框架Scrapy基本用法入门教程
Jul 26 Python
selenium 安装与chromedriver安装的方法步骤
Jun 12 Python
Python手绘可视化工具cutecharts使用实例
Dec 05 Python
pytorch 自定义卷积核进行卷积操作方式
Dec 30 Python
Pandas时间序列:时期(period)及其算术运算详解
Feb 25 Python
python实现人性化显示金额数字实例详解
Sep 25 Python
python 基于opencv实现高斯平滑
Dec 18 Python
python wsgiref源码解析
Feb 06 Python
python3 sqlite3限制条件查询的操作
Apr 07 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函数utf8转gb2312编码
2006/12/21 PHP
PHP 常用函数库和一些实用小技巧
2009/01/01 PHP
php环境配置之CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI比较?
2011/10/17 PHP
php递归函数中使用return的注意事项
2014/01/17 PHP
PHP Oauth授权和本地加密实现方法
2016/08/12 PHP
动态表格Table类的实现
2009/08/26 Javascript
动态样式类封装JS代码
2009/09/02 Javascript
javascript 全等号运算符使用说明
2010/05/31 Javascript
JavaScript中的几个关键概念的理解-原型链的构建
2011/05/12 Javascript
电子商务网站上的常用的js放大镜效果
2011/12/08 Javascript
JQuery slideshow的一个小问题(如何发现及解决过程)
2013/02/06 Javascript
图文详解JavaScript的原型对象及原型链
2016/08/02 Javascript
浅谈js中子页面父页面方法 变量相互调用
2016/08/04 Javascript
利用transition实现文字上下抖动的效果
2017/01/21 Javascript
Bootstrap响应式导航由768px变成992px的实现代码
2017/06/15 Javascript
vue中eventbus被多次触发以及踩过的坑
2017/12/02 Javascript
小程序实现订单倒计时功能
2019/04/23 Javascript
详解在Javascript中进行面向切面编程
2019/04/28 Javascript
vue路由拦截器和请求拦截器知识点总结
2019/11/08 Javascript
[02:10]DOTA2亚洲邀请赛 EG战队出场宣传片
2015/02/07 DOTA
Python向Excel中插入图片的简单实现方法
2018/04/24 Python
Anaconda2下实现Python2.7和Python3.5的共存方法
2018/06/11 Python
python 与服务器的共享文件夹交互方法
2018/12/27 Python
h5网页水印SDK的实现代码示例
2019/02/19 HTML / CSS
美国知名艺术画网站:Art.com
2017/02/09 全球购物
牧马人澳大利亚官网:Wrangler澳大利亚
2019/10/08 全球购物
公证书样本
2014/04/10 职场文书
团日活动总结报告
2014/06/25 职场文书
综合测评个人总结
2015/03/03 职场文书
医药公司开票员岗位职责
2015/04/15 职场文书
离婚撤诉申请书范本
2015/05/18 职场文书
获奖感言怎么写
2015/07/31 职场文书
高中议论文(范文2篇)
2019/08/19 职场文书
​(迎国庆)作文之我爱我的祖国
2019/09/19 职场文书
Python图像处理库PIL详细使用说明
2022/04/06 Python
浅析Python OpenCV三种滤镜效果
2022/04/11 Python