multiprocessing中进程池,线程池的使用
multiprocessing
多进程基本使用
- 示例代码1
import time
import random
from multiprocessing import Process
def run(name):
print(f'{name} is running')
time.sleep(random.randint(1,3))
print(f'{name} is end')
if __name__ =='__main__':
p_list = []
for i in range(3):
# 传参的两种方式
# p = Process(target=run,kwargs={'name':f'线程{i}'})
p = Process(target=run,args=(f"线程{i}",))
p_list.append(p)
p.start()
# for i in p_list:
# p.join() # join后主进程会等待子进程都结束再结束
print('主进程结束')
# strat():方法的功能 1.开启进程 2.执行功能
- 示例代码2
import os
import time
import random
from multiprocessing import Process
class Run(Process):
def __init__(self,name):
super().__init__()
self.name = name
def run(self): # 必须实现run方法
print(os.getppid(),os.getpid())
print(f'{self.name} is running')
time.sleep(random.randint(1,3))
print(f'{self.name} is end')
if __name__ =='__main__':
p_list = []
for i in range(5):
p = Run(f'线程{i}')
p_list.append(p)
p.start()
for i in p_list:
p.join()
print('主进程结束',os.getpid())
进程池(from multiprocessing import Pool)
- 进程池原理
- 示例代码(串行)
import os
import time
from multiprocessing import Pool
def task(n):
print('{} is running'.format(os.getpid()))
time.sleep(2)
print('{} is done'.format(os.getpid()))
return n**2
if __name__ == '__main__':
# print(os.cpu_count()) #查看cpu个数
p = Pool(4) # 最大四个进程
for i in range(1,7): # 开7个任务
ret = p.apply(task,args=(i,)) #同步的,一个运行完才执行另一个
print(f'本次任务结束:{ret}')
p.close() # 禁止往进程池内在添加任务
p.join() # 等待进程池
print('主进程')
- 示例代码(并行)
import os
import time
from multiprocessing import Pool
def task(n):
print('{} is running'.format(os.getpid()))
time.sleep(2)
print('{} is done'.format(os.getpid()))
return n**2
if __name__ == '__main__':
# print(os.cpu_count()) #查看cpu个数
ret_lis = []
p = Pool(4) # 最大四个进程
for i in range(1,7): # 开7个任务
ret = p.apply_async(task,args=(i,)) # 异步的,一个运行完才执行另一个
ret_lis.append(ret)
p.close() # 禁止往进程池内在添加任务
p.join() # 等待进程池
# print('主进程')
print(_.get() for _ in ret_lis)
更多参数请参考:https://www.cnblogs.com/damumu/p/7321732.html
线程池(from multiprocessing.dummy import Pool)
- 线程池的原理
- 线程池首先会维护一个任务队列
- 生成工作使用的线程(可以是自定义个数,也可以是系统默认)
- 线程分别从队列中取出任务,并执行,一个任务执行完成需要告诉主线程完成一个任务
- 再从任务队列中取出任务,直到所有任务为空,退出线程
- 为什么需要使用线程池
- 创建/销毁线程伴随着系统开销,过于频繁的创建/销毁线程,会很大程度上影响处理效率。
记创建线程消耗时间T1,执行任务消耗时间T2,销毁线程消耗时间T3,如果T1+T3>T2,那说明开启一个线程来执行这个任务太不划算了!在线程池缓存线程可用已有的闲置线程来执行新任务,避免了创建/销毁带来的系统开销。
- 线程并发数量过多,抢占系统资源从而导致阻塞。
线程能共享系统资源,如果同时执行的线程过多,就有可能导致系统资源不足而产生阻塞的情况。
- 对线程进行一些简单的管理。
比如:延时执行、定时循环执行的策略等,运用线程池都能进行很好的实现。 - 示例代码
import requests
from multiprocessing.dummy import Pool
def get_source(url):
ret = requests.get(url)
return ret.text
def main():
urls = [
# ...,
# ...,
# ...,
]
pool = Pool(5)
ret_list = pool.map(get_source, urls)
pool.close()
# 调用join之前,先调用close函数,否则会出错。执行完close后不会有新的线程加入到pool,
# join函数等待所有子线程结束
pool.join()
for ret in ret_list:
print(ret)
print('*'*100)
# 更多关于dummy的介绍:https://my.oschina.net/zyzzy/blog/115096
if __name__ == '__main__':
main()
multiprocessing中进程池,线程池的使用的更多相关文章
- Python多进程库multiprocessing中进程池Pool类的使用[转]
from:http://blog.csdn.net/jinping_shi/article/details/52433867 Python多进程库multiprocessing中进程池Pool类的使用 ...
- concurrent.futures模块(进程池/线程池)
需要注意一下不能无限的开进程,不能无限的开线程最常用的就是开进程池,开线程池.其中回调函数非常重要回调函数其实可以作为一种编程思想,谁好了谁就去掉 只要你用并发,就会有锁的问题,但是你不能一直去自己加 ...
- Python-GIL 进程池 线程池
5.GIL vs 互斥锁(*****) 1.什么是GIL(Global Interpreter Lock) GIL是全局解释器锁,是加到解释器身上的,保护的就是解释器级别的数据 (比如垃圾回收的数据) ...
- 潭州课堂25班:Ph201805201 并发(进程与线程池) 第十四课 (课堂笔记)
循环执行一个线程 # -*- coding: utf-8 -*- # 斌彬电脑 # @Time : 2018/7/20 0020 5:35 import threading import queue ...
- Python学习之GIL&进程池/线程池
8.6 GIL锁** Global interpreter Lock 全局解释器锁 实际就是一把解释器级的互斥锁 In CPython, the global interpreter lock, or ...
- Python并发编程05 /死锁现象、递归锁、信号量、GIL锁、计算密集型/IO密集型效率验证、进程池/线程池
Python并发编程05 /死锁现象.递归锁.信号量.GIL锁.计算密集型/IO密集型效率验证.进程池/线程池 目录 Python并发编程05 /死锁现象.递归锁.信号量.GIL锁.计算密集型/IO密 ...
- Python标准模块--concurrent.futures 进程池线程池终极用法
concurrent.futures 这个模块是异步调用的机制concurrent.futures 提交任务都是用submitfor + submit 多个任务的提交shutdown 是等效于Pool ...
- python并发编程-进程池线程池-协程-I/O模型-04
目录 进程池线程池的使用***** 进程池/线程池的创建和提交回调 验证复用池子里的线程或进程 异步回调机制 通过闭包给回调函数添加额外参数(扩展) 协程*** 概念回顾(协程这里再理一下) 如何实现 ...
- 详解线程池的作用及Java中如何使用线程池
服务端应用程序(如数据库和 Web 服务器)需要处理来自客户端的高并发.耗时较短的请求任务,所以频繁的创建处理这些请求的所需要的线程就是一个非常消耗资源的操作.常规的方法是针对一个新的请求创建一个新线 ...
随机推荐
- Maven 安装与使用(一)
1. 安装 参考:http://maven.apache.org/install.html A. win7环境下,官网下载maven安装文件 B. 解压缩maven文件 C. 确认已配置好JAVA环境 ...
- javascript模块化以及加载打包
https://addyosmani.com/writing-modular-js/ 一些术语: 模块:可以理解为一个js文件,就像你以前需要import的那个文件一样:module不一定非要是一个外 ...
- Stack vs Heap
http://gribblelab.org/CBootcamp/7_Memory_Stack_vs_Heap.html Table of Contents Stack vs Heap The Stac ...
- javascript 时间日期处理相加,减操作方法js
javascript 时间日期处理相加,减操作方法js function dateAddDays(dataStr,dayCount){ var strdate = dataStr; // 2017年0 ...
- 事件循环进阶:macrotask与microtask
这段参考了参考来源中的第2篇文章(英文版的),(加了下自己的理解重新描述了下), 这里没法给大家演示代码,我就简单说下我的理解吧. promise和settimeout 在一起的时候执行顺序是个有意思 ...
- BZOJ1770:[USACO]lights 燈(高斯消元,DFS)
Description 貝希和她的閨密們在她們的牛棚中玩遊戲.但是天不從人願,突然,牛棚的電源跳閘了,所有的燈都被關閉了.貝希是一個很膽小的女生,在伸手不見拇指的無盡的黑暗中,她感到驚恐,痛苦與絕望. ...
- python中__init__.py与def __init__(self)的使用
一直对__init__的使用很迷茫,这里系统的学习了解下 1.__init__.py文件-package的标识 python中每个package实际上是一个目录(Directory),程序运行时如何识 ...
- 2019.1.4 SSH框架整合步骤(一)
SSH整合 1.三大框架整合原理 Spring与Struts2整合就是将Action对象交给Spring容器负责创建 Spring与Hibernate整合就是将sessionFactory交给Spri ...
- 使用腾讯云mysql的一下小坑
1. 数据库中标的命名,mybatis会给你全部转成驼峰命名,这样就会发现找不到数据库的表了.比如下面的,我在本地运行时ok, 表名称是t_blogtype,但是放到服务器就报错说找不到表. 2. 本 ...
- 二十五、详述 IntelliJ IDEA 提交代码前的 Code Analysis 机制
在我们用 IntelliJ IDEA 向 SVN 或者 Git 提交代码的时候,IntelliJ IDEA 提供了一个自动分析代码的功能,即Perform code analysis: 如上图所示,当 ...