背景

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

方法一:进程池/线程池

如下例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. httpWebRequest 错误
  2. vue html绑定数组,VueJs Class 与 Style 绑定 数组语法
  3. 国防科大提出基于可变形三维卷积的视频超分辨,代码已开源
  4. 详解优酷视频质量评价体系
  5. Windows Sysinternals Desktops v1.0 发布 - 超简单的虚拟桌面程序
  6. C 语言 printf 输出详解
  7. [Linux]使用宝塔面板做负载均衡时遇到的问题和解决办法
  8. 0.618 与 1.414
  9. 【Elasticsearch教程20】Pinyin拼音分词器 以及多音字修改
  10. 985硕士美女程序媛:10次面试的真实经历!阿里/携程/美团/58/华为....
  11. GPT磁盘如何正确分区以及UEFI引导怎么修复?
  12. git学习之时光穿梭机
  13. html ul实现手机页面,手机端网页banner实现
  14. PowerShell的基本使用方法
  15. 一些英文词的标准缩写
  16. 从智慧交通、智慧安防、智能电网的应用来看我国智慧城市建设现状
  17. C++ Reference: Standard C++ Library reference: C Library: cmath: erfc
  18. 华为AP4050DN-HD使用tftp、uboot瘦转胖
  19. 卸载symantec AntiVirus Client客户端,要求输入密码。。。。
  20. python 财务报表 建模_Python进行统计建模

热门文章

  1. extjs2.0 ie8 下拉树_extjs自定义下拉树
  2. PCL点云特征描述与提取(2)
  3. 【飘移】仅需7个动作完成“斯堪的纳维亚钟摆”飘移过弯教程
  4. 面试前赶紧看了5道Python Web面试题,Python面试题No17
  5. Python-接口自动化(二)
  6. this.$router.push、replace、go的区别
  7. 7 个 jQuery 最佳实践
  8. 如果asp.net mvc中某个action被执行了两次,请检查是不是以下的原因
  9. Android提示框与通知的使用
  10. winsock select