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的Django框架测试驱动开发的教程
Apr 22 Python
实现python版本的按任意键继续/退出
Sep 26 Python
Django接受前端数据的几种方法总结
Nov 04 Python
Python嵌套式数据结构实例浅析
Mar 05 Python
用python写测试数据文件过程解析
Sep 25 Python
python中设置超时跳过,超时退出的方式
Dec 13 Python
keras 使用Lambda 快速新建层 添加多个参数操作
Jun 10 Python
通过实例解析Python RPC实现原理及方法
Jul 07 Python
Python 解析简单的XML数据
Jul 24 Python
如何使用PyCharm引入需要使用的包的方法
Sep 22 Python
Python3压缩和解压缩实现代码
Mar 01 Python
Python的代理类实现,控制访问和修改属性的权限你都了解吗
Mar 21 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将字符串全部转换成大写或者小写的方法
2015/03/17 PHP
PHP使用curl制作简易百度搜索
2016/11/03 PHP
PHP实现的简单组词算法示例
2018/04/10 PHP
自适应图片大小的弹出窗口
2006/07/27 Javascript
浏览器加载、渲染和解析过程黑箱简析
2012/11/29 Javascript
关于ExtJS4.1:快捷键支持的问题
2013/04/24 Javascript
ajax与302响应代码测试
2013/10/23 Javascript
一个判断抢购时间是否到达的简单的js函数
2014/06/23 Javascript
js+jquery实现图片裁剪功能
2015/01/02 Javascript
nodejs导出excel的方法
2015/06/30 NodeJs
jQuery实现获取绑定自定义事件元素的方法
2015/12/02 Javascript
js修改onclick动作的四种方法(推荐)
2016/08/18 Javascript
解决node修改后需频繁手动重启的问题
2018/05/13 Javascript
vue实现后台管理权限系统及顶栏三级菜单显示功能
2019/06/19 Javascript
详解vuex数据传输的两种方式及this.$store undefined的解决办法
2019/08/26 Javascript
详解Howler.js Web音频播放终极解决方案
2020/08/23 Javascript
如何阻止移动端浏览器点击图片浏览
2020/08/29 Javascript
[01:46]TI4西雅图DOTA2前线报道 中国选手抱团调时差
2014/07/08 DOTA
[01:06:59]完美世界DOTA2联赛PWL S2 Magma vs FTD 第一场 11.29
2020/12/02 DOTA
一步步解析Python斗牛游戏的概率
2016/02/12 Python
Python 的描述符 descriptor详解
2016/02/27 Python
python:pandas合并csv文件的方法(图书数据集成)
2018/04/12 Python
python正向最大匹配分词和逆向最大匹配分词的实例
2018/11/14 Python
python 列表递归求和、计数、求最大元素的实例
2018/11/28 Python
python爬虫实现中英翻译词典
2019/06/25 Python
pygame编写音乐播放器的实现代码示例
2019/11/19 Python
解决Python安装cryptography报错问题
2020/09/03 Python
HTML5 的新的表单元素(datalist/keygen/output)使用介绍
2013/07/19 HTML / CSS
Sephora丝芙兰泰国官方网站:国际知名化妆品购物
2017/11/15 全球购物
"引用"与多态的关系
2013/02/01 面试题
区域总监的岗位职责
2013/11/21 职场文书
干部行政关系介绍信
2014/01/17 职场文书
2014年国庆节活动总结
2014/08/26 职场文书
主题班会开场白
2015/06/01 职场文书
pytorch 权重weight 与 梯度grad 可视化操作
2021/06/05 Python
CSS3实现指纹特效代码
2022/03/17 HTML / CSS