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中使用第三方库xlrd来读取Excel示例
Apr 05 Python
Python利用字典将两个通讯录文本合并为一个文本实例
Jan 16 Python
Python unittest模块用法实例分析
May 25 Python
完美解决python中ndarray 默认用科学计数法显示的问题
Jul 14 Python
Django JWT Token RestfulAPI用户认证详解
Jan 23 Python
python实现电子产品商店
Feb 26 Python
使用Python实现跳一跳自动跳跃功能
Jul 10 Python
获取Pytorch中间某一层权重或者特征的例子
Aug 17 Python
Python爬虫抓取指定网页图片代码实例
Jul 24 Python
Django如何重置migration的几种情景
Feb 24 Python
python Tkinter模块使用方法详解
Apr 07 Python
用PYTHON去计算88键钢琴的琴键频率和音高
Apr 10 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中return 和 exit 、break和contiue 区别与用法
2012/04/09 PHP
WordPress中用于获取搜索表单的PHP函数使用解析
2016/01/05 PHP
JavaScript 事件冒泡简介及应用
2010/01/11 Javascript
jQuery 菜单随滚条改为以定位方式(固定要浏览器顶部)
2012/05/24 Javascript
nodejs的10个性能优化技巧
2014/07/15 NodeJs
JS 数字转换为大写金额的简单实例
2016/08/04 Javascript
JS中的hasOwnProperty()和isPrototypeOf()属性实例详解
2016/08/11 Javascript
jQuery事件用法详解
2016/10/06 Javascript
vue实现消息的无缝滚动效果的示例代码
2017/12/05 Javascript
JS实现根据详细地址获取经纬度功能示例
2019/04/16 Javascript
layui select 禁止点击的实现方法
2019/09/05 Javascript
java遇到微信小程序 "支付验证签名失败" 问题解决
2019/12/22 Javascript
微信小程序点击view动态添加样式过程解析
2020/01/21 Javascript
[05:53]敌法师的金色冠名ID"BurNIng",是传说,是荣耀
2020/07/11 DOTA
python实现的简单猜数字游戏
2015/04/04 Python
Python定时执行之Timer用法示例
2015/05/27 Python
python实现决策树分类算法
2017/12/21 Python
对python中的pop函数和append函数详解
2018/05/04 Python
linux安装Python3.4.2的操作方法
2018/09/28 Python
python用pandas数据加载、存储与文件格式的实例
2018/12/07 Python
ubuntu 16.04下python版本切换的方法
2019/06/14 Python
详解python websocket获取实时数据的几种常见链接方式
2019/07/01 Python
Django框架 Pagination分页实现代码实例
2019/09/04 Python
浅谈Django中的QueryDict元素为数组的坑
2020/03/31 Python
美国本地交易和折扣网站:LocalFlavor.com
2017/10/26 全球购物
中药专业大学生医药工作求职信
2013/10/25 职场文书
医药营销个人求职信范文
2014/02/07 职场文书
公司会计岗位职责
2014/02/13 职场文书
学习雷锋倡议书
2014/04/15 职场文书
法院授权委托书格式
2014/09/28 职场文书
工作调动申请报告
2015/05/18 职场文书
撤诉申请书法院范本
2015/05/18 职场文书
小学班级标语口号大全
2015/12/26 职场文书
Python列表删除重复元素与图像相似度判断及删除实例代码
2021/05/07 Python
vue如何实现关闭对话框后刷新列表
2022/04/08 Vue.js
Golang流模式之grpc的四种数据流
2022/04/13 Golang