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中解析XML数据的方法
Oct 15 Python
python 默认参数问题的陷阱
Feb 29 Python
Python各类图像库的图片读写方式总结(推荐)
Feb 23 Python
用python写扫雷游戏实例代码分享
May 27 Python
python中ImageTk.PhotoImage()不显示图片却不报错问题解决
Dec 06 Python
python爬虫简单的添加代理进行访问的实现代码
Apr 04 Python
python经典趣味24点游戏程序设计
Jul 26 Python
python自动化测试之异常及日志操作实例分析
Nov 09 Python
PyTorch中的Variable变量详解
Jan 07 Python
python3 使用ssh隧道连接mysql的操作
Dec 05 Python
一篇文章带你搞懂Python类的相关知识
May 20 Python
Python中非常使用的6种基本变量的操作与技巧
Mar 22 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脚本的10个技巧(4)
2006/10/09 PHP
我的论坛源代码(八)
2006/10/09 PHP
编写Smarty插件在模板中直接加载数据的详细介绍
2013/06/26 PHP
php 字符串压缩方法比较示例
2014/01/23 PHP
php除数取整示例
2014/04/24 PHP
php中in_array函数用法探究
2014/11/25 PHP
php学习笔记之mb_strstr的基本使用
2018/02/03 PHP
laravel 自定义常量的两种方案
2019/10/14 PHP
Jquery实现搜索框提示功能示例代码
2013/08/13 Javascript
php的文件上传入门教程(实例讲解)
2014/04/10 Javascript
快速解决jquery.touchSwipe左右滑动和垂直滚动条冲突
2016/04/15 Javascript
jQuery 检查某个元素在页面上是否存在实例代码
2016/10/27 Javascript
js实时获取窗口大小变化的实例代码
2016/11/18 Javascript
详解js的事件处理函数和动态创建html标记方法
2016/12/16 Javascript
JavaScript 上传文件(psd,压缩包等),图片,视频的实现方法
2017/06/19 Javascript
使用vue-cli编写vue插件的方法
2018/02/26 Javascript
vue实现数据控制视图的原理解析
2020/01/07 Javascript
在vue中实现清除echarts上次保留的数据(亲测有效)
2020/09/09 Javascript
深入讲解Python编程中的字符串
2015/10/14 Python
Python基于tkinter模块实现的改名小工具示例
2017/07/27 Python
http请求 request失败自动重新尝试代码示例
2018/01/25 Python
numpy.delete删除一列或多列的方法
2018/04/03 Python
布隆过滤器的概述及Python实现方法
2019/12/08 Python
使用已经得到的keras模型识别自己手写的数字方式
2020/06/29 Python
HTML5打开手机扫码功能及优缺点
2017/11/27 HTML / CSS
如何在Canvas中添加事件的方法示例
2019/05/21 HTML / CSS
DKNY品牌官网:纽约大都会时尚风格
2016/10/20 全球购物
美国领先的家居装饰和礼品商店:Kirkland’s
2017/01/30 全球购物
白色公司:The White Company
2017/10/11 全球购物
COACH德国官方网站:纽约现代奢侈品牌,1941年
2018/06/09 全球购物
SQL Server的固定数据库角色都有哪些?对应的服务器权限有哪些?
2013/05/18 面试题
演讲稿开场白
2014/01/13 职场文书
婚前保证书
2014/04/29 职场文书
捐款活动总结
2014/08/27 职场文书
2015年社区党务工作总结
2015/04/21 职场文书
2016年党员公开承诺书格式范文
2016/03/24 职场文书