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中使用item()方法遍历字典的例子
Aug 26 Python
python使用epoll实现服务端的方法
Oct 16 Python
pyqt5 实现多窗口跳转的方法
Jun 19 Python
python字典改变value值方法总结
Jun 21 Python
淘宝秒杀python脚本 扫码登录版
Sep 19 Python
python读取ini配置的类封装代码实例
Jan 08 Python
django 文件上传功能的相关实例代码(简单易懂)
Jan 22 Python
Python 分布式缓存之Reids数据类型操作详解
Jun 24 Python
PyQt5-QDateEdit的简单使用操作
Jul 12 Python
matplotlib教程——强大的python作图工具库
Oct 15 Python
Django如何继承AbstractUser扩展字段
Nov 27 Python
python中slice参数过长的处理方法及实例
Dec 15 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.ini中的php-5.2.0配置指令详解
2008/03/27 PHP
php将access数据库转换到mysql数据库的方法
2014/12/24 PHP
php单例模式示例分享
2015/02/12 PHP
textContent在Firefox下与innerText等效的属性
2007/05/12 Javascript
建议大家看下JavaScript重要知识更新
2007/07/08 Javascript
关于jquery性能最佳实践的讨论,与求教
2012/03/30 Javascript
jQuery中 noConflict() 方法使用
2013/04/25 Javascript
jquery.hotkeys监听键盘按下事件keydown插件
2014/05/11 Javascript
借助JavaScript脚本判断浏览器Flash Player信息的方法
2014/07/09 Javascript
JS+CSS实现简单滑动门(滑动菜单)效果
2015/09/19 Javascript
JavaScript仿百度图片浏览效果
2016/11/23 Javascript
Bootstrap页面标题Page Header的实现方法
2017/03/22 Javascript
jQuery实现拼图小游戏(实例讲解)
2017/07/24 jQuery
vue中当图片地址无效的时候,显示默认图片的方法
2018/09/18 Javascript
使用nodejs分离html文件里的js和css详解
2019/04/12 NodeJs
Vue组件模板及组件互相引用代码实例
2020/03/11 Javascript
解决vue 退出动画无效的问题
2020/08/09 Javascript
JavaScript Array.flat()函数用法解析
2020/09/02 Javascript
Vue项目开发常见问题和解决方案总结
2020/09/11 Javascript
python正则表达式re模块详细介绍
2014/05/29 Python
python决策树之CART分类回归树详解
2017/12/20 Python
python+ffmpeg视频并发直播压力测试
2018/03/06 Python
python中virtualenvwrapper安装与使用
2018/05/20 Python
使用python和pygame制作挡板弹球游戏
2019/12/03 Python
Python标准库itertools的使用方法
2020/01/17 Python
比利时网上药店: Drogisterij.net
2017/03/17 全球购物
最新结婚典礼主持词
2014/03/14 职场文书
大宝sod蜜广告词
2014/03/21 职场文书
领导干部廉政承诺书
2014/03/27 职场文书
委托书样本
2014/04/02 职场文书
春季运动会加油词
2015/07/18 职场文书
2015年十月一日放假通知
2015/08/18 职场文书
先进教师个人主要事迹材料
2015/11/03 职场文书
python3 实现mysql数据库连接池的示例代码
2021/04/17 Python
聊聊mysql都有哪几种分区方式
2022/04/13 MySQL
Python自动操作神器PyAutoGUI的使用教程
2022/06/16 Python