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 相关文章推荐
Pyhton中防止SQL注入的方法
Feb 05 Python
Python选择排序、冒泡排序、合并排序代码实例
Apr 10 Python
Python实现生成随机数据插入mysql数据库的方法
Dec 25 Python
Python爬虫包BeautifulSoup实例(三)
Jun 17 Python
详解如何将python3.6软件的py文件打包成exe程序
Oct 09 Python
Python实现对字典分别按键(key)和值(value)进行排序的方法分析
Dec 19 Python
使用Python爬虫库requests发送请求、传递URL参数、定制headers
Jan 25 Python
ipython jupyter notebook中显示图像和数学公式实例
Apr 15 Python
Python爬虫代理池搭建的方法步骤
Sep 28 Python
selenium携带cookies模拟登陆CSDN的实现
Jan 19 Python
Python解析m3u8拼接下载mp4视频文件的示例代码
Mar 03 Python
python基于opencv批量生成验证码的示例
Apr 28 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
全国FM电台频率大全 - 13 福建省
2020/03/11 无线电
PHP Document 代码注释规范
2009/04/13 PHP
ajax+php打造进度条代码[readyState各状态说明]
2010/04/12 PHP
php自定义的格式化时间示例代码
2013/12/05 PHP
php生成随机数的三种方法
2014/09/10 PHP
php实现递归抓取网页类实例
2015/04/03 PHP
Ajax PHP JavaScript MySQL实现简易无刷新在线聊天室
2016/08/17 PHP
详解PHP中的序列化、反序列化操作
2017/03/21 PHP
Yii2数据库操作常用方法小结
2017/05/04 PHP
效率高的Javscript字符串替换函数的benchmark
2008/08/02 Javascript
Extjs学习笔记之四 工具栏和菜单
2010/01/07 Javascript
用jquery模仿的a的title属性(兼容ie6/7)
2013/01/21 Javascript
详解Vue.js基于$.ajax获取数据并与组件的data绑定
2017/05/26 Javascript
详解vue slot插槽的使用方法
2017/06/13 Javascript
JS鼠标3次点击事件实现代码及扩展思路
2017/09/12 Javascript
vue通过cookie获取用户登录信息的思路详解
2018/10/30 Javascript
使用taro开发微信小程序遇到的坑总结
2019/04/08 Javascript
实用Javascript调试技巧分享(小结)
2019/06/18 Javascript
vue 微信分享回调iOS和安卓回调出现错误的解决
2020/09/07 Javascript
vue element和nuxt的使用技巧分享
2021/01/14 Vue.js
[54:53]完美世界DOTA2联赛PWL S2 GXR vs PXG 第二场 11.18
2020/11/18 DOTA
利用python程序帮大家清理windows垃圾
2017/01/15 Python
离线安装Pyecharts的步骤以及依赖包流程
2020/04/23 Python
Flask模拟实现CSRF攻击的方法
2018/07/24 Python
Python多进程池 multiprocessing Pool用法示例
2018/09/07 Python
ALDI奥乐齐官方海外旗舰店:德国百年超市
2017/12/27 全球购物
英国领先的亚洲旅游专家:Wendy Wu Tours
2018/01/21 全球购物
请问如下代码执行后a和b的值分别是什么
2016/05/05 面试题
婚礼证婚人证婚词
2014/01/13 职场文书
项目总经理岗位职责
2014/02/14 职场文书
运动会稿件100字
2014/02/21 职场文书
班风学风建设方案
2014/05/06 职场文书
特教教师先进事迹
2014/05/21 职场文书
关于童年的读书笔记
2015/06/26 职场文书
上帝为你开了一扇窗之Tkinter常用函数详解
2021/06/02 Python
Python中itertools库的四个函数介绍
2022/04/06 Python