背景

日常开发中,难免遇到并发场景,而并发场景难免需要做流量控制,即需要对并发的进程或者线程的总量进行控制。 今天简单总结两种常用的控制线程个数的方法。

方法一:进程池/线程池

如下例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如何控制进程或者线程的个数相关推荐

  1. python进程数上限_python – 使用具有最大同时进程数的multipr...

    使用multiprocessing.Pool可能是最明智的.Pool根据系统上可用的最大内核数量生成一个工作进程池,然后在内核可用时基本上提供任务. from multiprocessing impo ...

  2. python进程管理讲解_python之supervisor进程管理工具

    [unix_http_server] file=/tmp/supervisor.sock ; socket文件的路径,supervisorctl用XML_RPC和supervisord通信就是通过它进 ...

  3. python 守护程序检测进程是否存在_python创建守护进程的疑问

    我自己写了一个简易的下载和文件执行的客户端,如下 """ 省略若干代码 """ #执行下载函数 def do_script(): " ...

  4. .gpg 进程 linux,小知识之Linux系统中的最大进程数,最大文件描述,最大线程数...

    今天来了解一下linux里面的一些小知识: (一)Linux系统中最大可以起多少个进程? (1)32位系统中最多可以起32768个进程 (2)64位系统中最多可以起2的22次方(4194304)约42 ...

  5. 怎样打开mysql进程数_mysql查看最大打开进程数

    今天在群里刚刚知道这个查看打开最大进程数的命令,下面来看一下吧~ cat /proc/27095/limits | grep Max open files 查看mysql最大打开进程数的命令 我们应该 ...

  6. python进程数上限_python-使用multiprocessing.Process并发进程数最多

    可能最明智的方法是使用multiprocessing.cpu_count(),它根据系统上可用的最大内核数生成一个工作进程池,然后基本上在内核可用时提供任务. 标准文档([http://docs.py ...

  7. python进程数上限_在多处理python中限制进程数

    限制并发连接数的最简单方法是使用线程池:#!/usr/bin/env python from itertools import izip, repeat from multiprocessing.du ...

  8. python键盘控制程序延迟_python 实现控制鼠标键盘

    1.安装类库 pip install pyautogui 2.代码: import pyautogui,time,random pyautogui.PAUSE = 3 pyautogui.FAILSA ...

  9. python两数求和_Python两数相加实现

    题目要求: 思路: 遍历第一个与第二个链表,把相同位置的相加 设置一个flag,用来标记相加后大于10的部分,下一位再相加时,就要加上flag的值 遍历至一个链表结束 如果此时flag不为0,把未结束 ...

最新文章

  1. android studio 3.0设置字体
  2. es6学习笔记(一)
  3. Mybatis代码生成适配Oracle和Mysql数据库_01
  4. 格雷码、二进制码、BCD编码
  5. 瑞幸“踩”着星巴克登顶?
  6. 生成交叉表的简单通用存储过程
  7. 直击平昌!2天40位大咖的平昌区块链论坛精华都在这了!
  8. XSS挖漏洞 - CSS编码和反斜杠的三个技巧
  9. paip.sqlite 管理最好的工具 SQLite Expert 最佳实践总结
  10. nmake命令(windows下的makefile)
  11. 量子计算机王,王正汉|量子计算机:下一轮工业革命的引擎
  12. 系统时间与服务器时间同步出错,Win7电脑时间同步出错是怎么回事?系统时间同步失败如何解决?...
  13. 联盟营销最佳实践:提高联盟计划的投资回报率
  14. 取火柴 c语言程序,hdu 1907 John(取火柴游戏)
  15. dxdiag使用小结
  16. Linux du命令(du -h ,du -s)
  17. android 虚拟键 高度,Android获取虚拟按键的高度(适配全面屏)
  18. 【机器学习】生成模型与判别模型详解
  19. 群表示论之Able群的不可约表示
  20. 嵌入式linux下控制电机运动

热门文章

  1. msdn画圆弧函数_复变函数与积分变换 简明笔记(八):保形映射(共形映射)
  2. 【力扣网练习题】删除排序数组中的重复项
  3. Linux下查看Nginx,tomcat等的并发连接数和连接状态
  4. 剑指offer-----Python-----栈
  5. Android Studio 在项目中引用第三方jar包
  6. [Manthan, Codefest 18][Codeforces 1037E. Trips]
  7. Ubuntu dns
  8. 学习dubbo框架的问题
  9. 词法作用域和动态作用域
  10. 老李推荐:第14章4节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-端口转发 1...