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开发如何在ubuntu 15.10 上配置vim
Jan 25 Python
Python文件处理
Feb 29 Python
分析Python中设计模式之Decorator装饰器模式的要点
Mar 02 Python
python中OrderedDict的使用方法详解
May 05 Python
python with提前退出遇到的坑与解决方案
Jan 05 Python
Python实现抓取HTML网页并以PDF文件形式保存的方法
May 08 Python
基于anaconda下强大的conda命令介绍
Jun 11 Python
python 检查是否为中文字符串的方法
Dec 28 Python
python文字和unicode/ascll相互转换函数及简单加密解密实现代码
Aug 12 Python
Python新手学习函数默认参数设置
Jun 03 Python
Python3爬虫中关于中文分词的详解
Jul 29 Python
Python如何将将模块分割成多个文件
Aug 04 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
phpmyadmin里面导入sql语句格式的大量数据的方法
2010/06/05 PHP
php生成随机密码的三种方法小结
2010/09/04 PHP
JavaScript事件列表解说
2006/12/22 Javascript
javascript之典型高阶函数应用介绍二
2013/01/10 Javascript
IE的fireEvent方法概述及应用
2013/02/22 Javascript
原生js拖拽(第一课 未兼容)拖拽思路
2013/03/29 Javascript
form.submit()不能提交表单的错误原因及解决方法
2014/10/13 Javascript
如何调试异步加载页面里包含的js文件
2014/10/30 Javascript
jQuery事件对象总结
2016/10/17 Javascript
JS实现课堂随机点名和顺序点名
2017/03/09 Javascript
如何将 jQuery 从你的 Bootstrap 项目中移除(取而代之使用Vue.js)
2017/07/17 jQuery
利用vue组件自定义v-model实现一个Tab组件方法示例
2017/12/06 Javascript
纯javascript前端实现base64图片下载(兼容IE10+)
2018/09/14 Javascript
vue-cli 脚手架基于Nightwatch的端到端测试环境的过程
2018/09/30 Javascript
微信小程序分享功能onShareAppMessage(options)用法分析
2019/04/24 Javascript
微信小程序连续签到7天积分获得功能的示例代码
2020/08/20 Javascript
JavaScript日期库date-fn.js使用方法解析
2020/09/09 Javascript
[44:33]EG vs Liquid 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
pycharm 使用心得(六)进行简单的数据库管理
2014/06/06 Python
Python面向对象编程基础解析(二)
2017/10/26 Python
Python装饰器简单用法实例小结
2018/12/03 Python
Python循环中else,break和continue的用法实例详解
2019/07/11 Python
numpy np.newaxis 的实用分享
2019/11/30 Python
python 实现二维字典的键值合并等函数
2019/12/06 Python
如何使用python传入不确定个数参数
2020/02/18 Python
PyCharm中关于安装第三方包的三个建议
2020/09/17 Python
使用Python中tkinter库简单gui界面制作及打包成exe的操作方法(二)
2020/10/12 Python
Python wordcloud库安装方法总结
2020/12/31 Python
用html5实现语音搜索框的方法
2014/03/18 HTML / CSS
西班牙在线宠物商店:zooplus.es
2017/02/24 全球购物
学年自我鉴定
2014/01/16 职场文书
简洁的英文求职信范文
2014/05/03 职场文书
开展读书活动总结
2014/06/30 职场文书
超市创业计划书
2014/09/15 职场文书
2016年中秋祝酒词
2015/11/26 职场文书
技术入股合作协议书
2016/03/21 职场文书