python全栈开发 * 进程池,线程理论 ,threading模块 * 180727
一.进程池 (同步 异步 返回值)
缺点:
开启进程慢
几个CPU就能同时运行几个程序 进程的个数不是无线开启的
应用:
100个任务
进程池
如果必须用多个进程
且是高计算型 没有IO型的程序
希望并行 最充分的使用CPU
示例:
import os
import time
from multiprocessing import Pool
def func1():
time.sleep(2)
print(os.getpid(),i) if __name__=="__main__"":
p=Pool(5)
for i in range(100):
p.apply_async(func=func1,args=(i,))
p.close()
p.join()
print("主进程结束")
1. 同步请求 获取返回值
import os
import time
from multiprocessing import Pool,Process def haha(num):
time.sleep(0.5)
print(os.getpid(),num)
return True if __name__=="__main__":
p=Pool(5)
for i in range(20):
ret=p.apply(func=haha,args=(i,))
print(ret)
结果:一个一个的显示打印内容和返回值
2. 异步请求 不获取返回值
import os
import time
from multiprocessing import Pool,Process def haha(num):
time.sleep(0.5)
print(os.getpid(),num) if __name__=="__main__":
p=Pool(5)
for i in range(20):
p.apply_async(func=haha,args=(i,))
p.close()
p.join()
结果五个五个的显示打印内容
3. 异步请求 获取返回值
import os
import time
from multiprocessing import Pool,Process
def haha(num):
time.sleep(1)
print(os.getpid(),num)
return True if __name__=="__main__":
r_l=[]
p=Pool(5)
for i in range(20):
ret=p.apply_async(func=haha,args=(i,))
r_l.append(ret)
p.close()
p.join()
for ret in r_l:
print(ret.get())
结果 等待所有任务都执行完毕之后再统一获取结果
异步 apply_async总结1:
如果需要主进程等待,需要p.join
但是join的行为是依赖close 4. 异步请求 获取返回值 一个任务执行完毕之后就可以获取到一个结果(顺序是按照提交任务的顺序)
import os
import time
from multiprocessing import Pool,Process
def haha(num):
time.sleep(5)
print(os.getpid(),num)
return True if __name__=="__main__":
r_l=[]
p=Pool(5)
for i in range(20):
ret=p.apply_async(func=haha,args=(i,))
r_l.append(ret)
for ret in r_l:
print(ret.get())
结果:一个任务执行完毕之后就可以获取到一个结果(顺序是按照提交任务的顺序)
异步 apply_async总结2.
如果函数有返回值:
可以通过ret.get()来获取返回值
但是如果一边提交一边获取返回值会让程序变成同步
所以要想保留异步的效果应该将返回对象保存在列表中,所有任务提交完成之后再来取结果.
这种方式也可以去掉join,来完成主进程的阻塞等待池中的任务执行完毕
如果是异步的提交任务,那么任务提交之后进程池和主进程也异步了,
主进程不会自动等待进程池中的任务执行完毕.
二.回调函数
import os
import time
import random
from multiprocessing import Pool
def haha(num):
time.sleep()
print("pid :",os.getpid(),num)
return num
def back(arg):
print("callback :",os.getpid(),arg) if __name__=="__main__":
print("主进程",os.getpid())
p=Pool()
for i in range():
ret=p.apply_async(func=haha,args=(i,),callback=back)
p.close()
p.join()
#需要回调函数的场景:进程池中任何一个任务一旦处理完了,就立即告知主进程:我好了额,你可以处理我的结果了。
# 主进程则调用一个函数去处理该结果,该函数即回调函数
进程总结:
import os
import time
import random
from multiprocessing import Pool
def haha(num):
time.sleep()
print("pid :",os.getpid(),num)
return num
def back(arg):
print("callback :",os.getpid(),arg) if __name__=="__main__":
print("主进程",os.getpid())
p=Pool()
for i in range():
ret=p.apply_async(func=haha,args=(i,),callback=back)
p.close()
p.join()
#需要回调函数的场景:进程池中任何一个任务一旦处理完了,就立即告知主进程:我好了额,你可以处理我的结果了。
# 主进程则调用一个函数去处理该结果,该函数即回调函数
三.进程与线程对比:
进程
是计算机中最小的资源分配单位
在利用多个CPU执行的过程中,对多个程序的资源进行管理和隔离
进程的弊端
开启和关闭 以及 切换 都会带来很大的时间开销
过多的进程还会造成操作系统调度的压力 线程
线程是CPU调度的最小单位
每个进程中至少有一个线程
实际上执行代码的是线程
线程属于进程
进程负责获取操作系统分配给我的资源
线程负责执行代码
从代码的角度上看:
多进程:
开启和结束 时间花销大
切换的效率低
内存隔离
多线程:
开启和结束 时间开销非常小
切换效率高
内存不隔离
Cpython解释器下的全局解释器锁
在同一个进程中的多个线程在同一时刻只能有一个线程访问CPU
多线程无法形成并行
锁的线程
什么时候才会用到CPU
程序计算的时候
IO阻塞
是不会用到CPU的
Jpython解释器就没有全局解释器锁
pypy解释器没有全局解释器锁
4CPU
起四个进程
进程里起线程
四.Threading模块
示例:
import os
import time
from threading import Thread def func():
time.sleep()
print(,os.getpid()) print(,os.getpid())
for i in range():
Thread(target=func).start()
time.sleep()
python全栈开发 * 进程池,线程理论 ,threading模块 * 180727的更多相关文章
- Python全栈【进程、线程】
Python全栈[进程.线程] 本节内容: 进程 线程 协程 I/O多路复用 进程 1.进程就是一个程序在一个数据集上的一次动态执行过程,进程是资源分配的最小单元. 2.进程一般由程序.数据集.进程控 ...
- python 全栈开发,Day41(线程概念,线程的特点,进程和线程的关系,线程和python 理论知识,线程的创建)
昨日内容回顾 队列 队列 : 先进先出.数据进程安全 队列实现方式: 管道 + 锁 生产者消费者模型 : 解决数据供需不平衡 管道 双向通信 数据进程不安全 EOFError: 管道是由操作系统进行引 ...
- python全栈开发,Day41(线程概念,线程的特点,进程和线程的关系,线程和python理论知识,线程的创建)
昨日内容回顾 队列 队列:先进先出.数据进程安全 队列实现方式:管道+锁 生产者消费者模型:解决数据供需不平衡 管道 双向通信,数据进程不安全 EOFError: 管道是由操作系统进行引用计数的 必须 ...
- python全栈开发 * 进程理论 进程创建 * 180724
一.进程理论 1.进程是资源分配的最小单位. 2.进程调度就是多个进程在操作系统的控制下被CPU执行,去享用计算机的资源. 先来先服务 短作业优先 时间片轮转 多级反馈队列 3.进程调度的过程是不能够 ...
- python 全栈开发,Day29(昨日作业讲解,模块搜索路径,编译python文件,包以及包的import和from,软件开发规范)
一.昨日作业讲解 先来回顾一下昨日的内容 1.os模块 和操作系统交互 工作目录 文件夹 文件 操作系统命令 路径相关的 2.模块 最本质的区别 import会创建一个专属于模块的名字, 所有导入模块 ...
- python全栈开发从入门到放弃之模块和包
一 模块 1 什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用python编 ...
- python全栈开发 * 进程之间的通信,进程之间数据共享 * 180726
进程之间的通信(IPC)队列和管道一.队列 基于管道实现 管道 + 锁 数据安全(一).队列 队列遵循先进先出原则(FIFO) 多用于维护秩序,买票,秒杀 队列的所有方法: put()(给队列里添加数 ...
- python全栈开发day16-正则表达式和re模块
1.昨日内容回顾 2.正则表达式(re模块是python中和正则表达式相关的模块) 1.作用 1).输入字符串是否符合匹配条件 2).从大段文字中匹配出符合条件的内容 2.字符组 [0-9a-zA-Z ...
- Python全栈开发【模块】
Python全栈开发[模块] 本节内容: 模块介绍 time random os sys json & picle shelve XML hashlib ConfigParser loggin ...
随机推荐
- linux中Ctrl+D,Ctrl+Z,Ctrl+C
1.用stty -a查看控制字符的终端配置 2. ctrl-c 是发送 SIGINT 信号.终止一个进程 ctrl-z 是发送 SIGSTOP信号,挂起一个进程;命令fg唤回进程. ctrl-d 不是 ...
- 通过配置JVM参数解决生成日志存在乱码问题
项目上生产环境时出现一个问题,生成的日志文件存在乱码,服务器编码为 LANG=zh_US.UTF-8,按理说中文不会存在乱码,这里存在一个问题,就是在SIT等其他环境我们使用的连接工具为Xshell, ...
- Linux 搭建git 自己拉取本地 git pull,其他地方的git仓库拉取代码
Linux 下建立 Git 与 GitHub 的连接 Git 是一款开源的分布式版本控制系统,而 GitHub 是依托 Git 的代码托管平台. GitHub 利用 Git 极其强大的克隆和分支功能, ...
- 【ThinkPHP】解析ThinkPHP5创建模块
在根目录下有一个build.php文件,该文件是自动生成的,自动创建模块.build.php的文件内容如下: <?php return [ // 生成应用公共文件 '__file__' => ...
- 2017年PHP程序员未来路在何方
PHP 从诞生到现在已经有20多年历史,从Web时代兴起到移动互联网退潮,互联网领域各种编程语言和技术层出不穷, Node.js . GO . Python 不断地在挑战 PHP 的地位.这些技术的推 ...
- fastcgi php-cgi与php-fpm区别和之间的关系
关于FastCGI.php-cgi.php-fpm的区别是什么,各自有什么用途,以及相互间的关系是什么,查阅相关资料,可谓是众说纷纭,莫衷一是: 说法一:fastcgi是一个协议,php-fpm实现了 ...
- python--第八天总结
一.isinstance(obj, cls) 检查是否obj是否是类 cls 的对象 class Foo(object): pass obj = Foo() isinstance(obj, Foo) ...
- Linux常用指令笔记
目标:统计当前目录下java文件的个数 指令:`ls -R ./ | grep .java$ | wc -l` 原理:`ls -R ./`列出当前文件夹下的所有FILE,包括目录以及文件;`grep ...
- JS前端开发判断是否是手机端并跳转操作(小结)
JS前端开发判断是否是手机端并跳转操作(小结) 这篇文章主要介绍了JS前端开发判断是否是手机端并跳转操作,非常不错,具有参考借鉴价值,需要的朋友可以参考下 常用跳转代码 ? 1 2 3 4 5 6 7 ...
- 机器学习&深度学习基础(tensorflow版本实现的算法概述0)
tensorflow集成和实现了各种机器学习基础的算法,可以直接调用. 代码集:https://github.com/ageron/handson-ml 监督学习 1)决策树(Decision Tre ...