python多进程详解和协程
1、由于python多线程适合于多IO操作,但不适合于cpu计算型工作,这时候可以通过多进程实现。python多进程简单实用
# 多进程,可以cpu保持一致,python多线程适合多io.对于高cpu的可以通过多进程实现。
import multiprocessing
import time def run(name):
print(" %s process is running "%(name))
time.sleep() if __name__ == '__main__':
for i in range(, ):
process = multiprocessing.Process(target=run, args=(i,))
process.start()
2、python多进程。在操作系统中所有的进程都是有根进程(进程号0来创建的)。python获取主进程号和子进程号
# 多进程,可以cpu保持一致,python多线程适合多io.对于高cpu的可以通过多进程实现。
import multiprocessing
import time
import os def run(name):
print(" %s process is running "%(name))
time.sleep() def info(name):
print("%s"%(name))
print("当前进程号:%s"%(os.getpid()))
print("父进程号:%s"%(os.getppid())) if __name__ == '__main__':
info("parent process")
process = multiprocessing.Process(target=info,args=("child process",))
process.start() E:\Users\xiajinqi\PycharmProjects\Atm\venv\Scripts\python.exe E:/Users/xiajinqi/PycharmProjects/Atm/.py
parent process
当前进程号:
父进程号:
child process
当前进程号:
父进程号: Process finished with exit code
3、queue 实现进程通讯,进程Q要实现通讯。必须指明为进程Q。原理:在创建子进程时候,传递一个Q,实际相当于复制了一个新的Q给子进程。子进程向新的Q输入数据时候。进程Q通过一个反系列化实现将新的数据同步到旧的Q(即父进程Q)。两个程序之间内存是隔离的。Q也是相互独立的。
# 多进程,可以cpu保持一致,python多线程适合多io.对于高cpu的可以通过多进程实现。
from multiprocessing import Process,Queue # 只名为 进程Q
import time
import os qu = Queue() def test(qu):
qu.put(["克隆Q"]) if __name__ == '__main__': process = Process(target=test,args=(qu,))
process.start()
print(qu.get()) E:\Users\xiajinqi\PycharmProjects\Atm\venv\Scripts\python.exe E:/Users/xiajinqi/PycharmProjects/Atm/.py
['克隆Q'] Process finished with exit code
4、Pipe()实现管实现进程通讯。
# Pipe()
from multiprocessing import Process,Queue,Pipe # 只名为 进程Q
import time
import os def test(child_conn):
child_conn.send(['hello world'])
child_conn.send(['hello world'])
child_conn.close() if __name__ == '__main__':
parent_conn,child_conn = Pipe()
process = Process(target=test,args=(child_conn,))
process.start()
message1 = parent_conn.recv()
message2 = parent_conn.recv()
print(message1)
print(message2) E:\Users\xiajinqi\PycharmProjects\Atm\venv\Scripts\python.exe E:/Users/xiajinqi/PycharmProjects/Atm/333.py
['hello world']
['hello world'] Process finished with exit code 0
5、Manager 实现进程通讯,实现修改同一个数据。不需要锁
# Mangager
from multiprocessing import Process,Queue,Pipe,Manager # 只名为 进程Q
import time
import os def test(d,l):
d[os.getpid()] = os.getpid()
l.append( os.getpid())
print(d)
print(l) if __name__ == '__main__':
with Manager() as manager:
d = manager.dict()
l = manager.list(range())
p_list = []
for i in range(, ):
process = Process(target=test, args=(d, l))
process.start()
p_list.append(process) for process in p_list:
process.join() E:\Users\xiajinqi\PycharmProjects\Atm\venv\Scripts\python.exe E:/Users/xiajinqi/PycharmProjects/Atm/.py
{: }
[, , , , , , , , , , ]
{: , : }
[, , , , , , , , , , , ]
{: , : , : }
[, , , , , , , , , , , , ]
{: , : , : , : , : }
{: , : , : , : , : }
[, , , , , , , , , , , , , , ]
[, , , , , , , , , , , , , , ]
{: , : , : , : , : , : }
[, , , , , , , , , , , , , , , ]
{: , : , : , : , : , : , : }
[, , , , , , , , , , , , , , , , ]
{: , : , : , : , : , : , : , : }
[, , , , , , , , , , , , , , , , , ]
{: , : , : , : , : , : , : , : , : }
[, , , , , , , , , , , , , , , , , , ]
{: , : , : , : , : , : , : , : , : , : }
[, , , , , , , , , , , , , , , , , , , ] Process finished with exit code
6、进程池pool的使用,每启动一个进程就会消耗一定资源。使用pool可以避免机器崩溃发生。
pool = Pool(5) # 进程池5个,启动100个进程,只有在进程池中的5个才会执行。而不是同时执行100个,其他挂起状态。下面每次会打印5个
# Mangager
from multiprocessing import Process,Queue,Pipe,Manager,Pool,freeze_support # 只名为 进程Q
import time
import os def test(test):
time.sleep()
print("test") def bar(arg):
print("子进程执行完以后,回调后开始执行",arg) if __name__ == '__main__':
freeze_support()
pool = Pool() # 进程池5个,启动100个进程,只有在进程池中的5个才会执行。而不是同时执行100个,其他挂起状态,避免机器崩溃
for i in range(, ):
# pool.apply()串行
pool.apply_async(func=test,args=(test,),callback=bar) #并行 pool.close()
pool.join() E:\Users\xiajinqi\PycharmProjects\Atm\venv\Scripts\python.exe E:/Users/xiajinqi/PycharmProjects/Atm/.py
test
子进程执行完以后,回调后开始执行 None
test
子进程执行完以后,回调后开始执行 None
test
子进程执行完以后,回调后开始执行 None
test
子进程执行完以后,回调后开始执行 None
test
子进程执行完以后,回调后开始执行 None
test
子进程执行完以后,回调后开始执行 None
test
子进程执行完以后,回调后开始执行 None
test
子进程执行完以后,回调后开始执行 None
test
子进程执行完以后,回调后开始执行 None
test
子进程执行完以后,回调后开始执行 None Process finished with exit code
7、__name__ = "__main__" :手工执行时候。模块名为main。其他调用时候则是模块名。
8、协程本质上是单线程,是一种轻量级线程,协程有自己的寄存器上下文和堆栈。切换时候,将寄存器上下文和堆栈保存到其他地方。切换回来时候。恢复之前保存的寄存器上下文内容。协程能保留上一次执行时候的状态。
协程的好处:
无需线程上下文切换的开销(cpu)
无需原子锁定以及同步的开销
方便切换控制流,简化编程模型
高并发+高拓展性+低成本。一个CPU支持上万的携程不是问题。
缺点:
无法利用多核资源。因为协程本质就是一个单线程。需要和进程配合才能运行在多CPU上。
进行阻塞操作时候会阻塞整个程序。。
#yiled实现的协程
# Mangager
from multiprocessing import Process,Queue,Pipe,Manager,Pool,freeze_support # 只名为 进程Q
import time
import os def consumer(name) :
print("test")
while True:
new_baozi =yield
print("%s is eating %s"%(name,new_baozi)) def producer():
# 函数中如果有yiled,系统判定为生成器,需要用next才会执行
r = con1.__next__()
r = con2.__next__() n=
while n < :
n+
time.sleep()
#send 唤醒生成器。并且给他传递一个值
con1.send(n)
con2.send(n) if __name__ =="__main__":
con1 = consumer("test1")
con2 = consumer("test1")
p = producer()
8、手动切换协greenlet
# Mangager
from multiprocessing import Process,Queue,Pipe,Manager,Pool,freeze_support # 只名为 进程Q
from greenlet import greenlet
import time
import os def test1():
print("test1")
t2.switch()
time.sleep() #为iO占用时间
print("test11")
t2.switch() def test2():
print("tets2")
t1.switch()
time.sleep()
print("test22") t1 = greenlet(test1)
t2 = greenlet(test2)
t1.switch()
9、gevent 自动切换(前面的封装)gevent 每个1秒切换
# Mangager
from multiprocessing import Process,Queue,Pipe,Manager,Pool,freeze_support # 只名为 进程Q
import gevent
import time
import os def test1():
print("test1")
gevent.sleep(1)
print("test11") def test2():
print("tets2")
gevent.sleep(1)
print("test22") #启动携程加入队列
gevent.joinall([gevent.spawn(test1),agevent.spawn(test2)])
# Mangager
from multiprocessing import Process,Queue,Pipe,Manager,Pool,freeze_support # 只名为 进程Q
import gevent
import time
import os def test1():
print("test1")
gevent.sleep()
print("test11") def test2():
print("tets2")
gevent.sleep()
print("test22") #启动携程加入队列
gevent.joinall([gevent.spawn(test1),gevent.spawn(test2)]) E:\Users\xiajinqi\PycharmProjects\Atm\venv\Scripts\python.exe E:/Users/xiajinqi/PycharmProjects/Atm/.py
test1
tets2
test22
test11 Process finished with exit code
10 、 gevent 实际应用时间测试。爬多个网页
# Mangager
from multiprocessing import Process,Queue,Pipe,Manager,Pool,freeze_support # 只名为 进程Q
import gevent
import time
import os
from urllib import request #
from gevent import monkey # 这个补丁才可以让gevent捕获IO def f(url):
res = request.urlopen(url) url = [
"https://www.baidu.com",
"https://www.yylending.com",
"https://www.yyfax.com"
] start_time = time.time()
gevent.joinall([gevent.spawn(f,"https://www.baidu.com"),gevent.spawn(f,"https://www.yylending.com"),gevent.spawn(f,"https://www.yyfax.com")])
print("并行",(time.time()-start_time)) start_time = time.time()
for i in url:
f(i)
print("串行",(time.time()-start_time)) E:\Users\xiajinqi\PycharmProjects\Atm\venv\Scripts\python.exe E:/Users/xiajinqi/PycharmProjects/Atm/.py
并行 1.3772048950195312
串行 0.9304625988006592 Process finished with exit code
python多进程详解和协程的更多相关文章
- python 多进程,多线程,协程
在我们实际编码中,会遇到一些并行的任务,因为单个任务无法最大限度的使用计算机资源.使用并行任务,可以提高代码效率,最大限度的发挥计算机的性能.python实现并行任务可以有多进程,多线程,协程等方式. ...
- Python多进程、多线程、协程
转载:https://www.cnblogs.com/huangguifeng/p/7632799.html 首先我们来了解下python中的进程,线程以及协程! 从计算机硬件角度: 计算机的核心是C ...
- Python多进程、多线程和协程简介
一.进程和线程 进程是一个执行中的程序.每个进程都拥有自己的地址空间.内存.数据栈以及其他用于跟踪执行的辅助数据.在单核CPU系统中的多进程,内存中可以有许多程序,但在给定一个时刻只有一个程序在运行: ...
- python多进程详解
目录 python多进程 序.multiprocessing 一.Process process介绍 例1.1:创建函数并将其作为单个进程 例1.2:创建函数并将其作为多个进程 例1.3:将进程定义为 ...
- golang channel详解和协程优雅退出
非缓冲chan,读写对称 非缓冲channel,要求一端读取,一端写入.channel大小为零,所以读写操作一定要匹配. func main() { nochan := make(chan int) ...
- python中日志logging模块的性能及多进程详解
python中日志logging模块的性能及多进程详解 使用Python来写后台任务时,时常需要使用输出日志来记录程序运行的状态,并在发生错误时将错误的详细信息保存下来,以别调试和分析.Python的 ...
- 深入浅析python中的多进程、多线程、协程
深入浅析python中的多进程.多线程.协程 我们都知道计算机是由硬件和软件组成的.硬件中的CPU是计算机的核心,它承担计算机的所有任务. 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源 ...
- python多线程详解
目录 python多线程详解 一.线程介绍 什么是线程 为什么要使用多线程 二.线程实现 threading模块 自定义线程 守护线程 主线程等待子线程结束 多线程共享全局变量 互斥锁 递归锁 信号量 ...
- Python 线程和进程和协程总结
Python 线程和进程和协程总结 线程和进程和协程 进程 进程是程序执行时的一个实例,是担当分配系统资源(CPU时间.内存等)的基本单位: 进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其 ...
随机推荐
- 将eChart图片利用POI导出到Excel
在使用POI进行将数据导出到Excel时, 若要将eChart在前端生成的统计图(如柱状图.折线图.饼图等)一并导出,使用POI在后台构建数据图比较复杂,因此我选择将eChart在前端的统计图的bas ...
- SSM框架——实现分页和搜索分页
登录|注册 在路上 在路上,要懂得积累:在路上,要学会放下:我在路上!Stay hungry,Stay foolish. 目录视图 摘要视图 订阅 [公告]博客系统优化升级 ...
- Linux入门-6 Linux网络基本配置
1. 网络基础知识 网络编址 IP编址 子网掩码 同一网络主机之间通信--MAC地址 不同网络之间的通信 路由 域名 DNS 基本网络参数 2. Linux网络基础配置 以太网连接 配置网络信息 网络 ...
- 提升PHP速度
PHP的优点之一是速度很快,对于一般的网站应用,可以说是已经足够了.不过如果站点的访问量很高.带宽窄或者其它的因素令服务器产生性能瓶颈的时候,你可能得想想其它的办法来进一步提高PHP的速度了.这篇文章 ...
- HDFS Namenode&Datanode
HDFS Namenode&Datanode HDFS 机制粗略示意图 客户端写入文件流程: NN && DN Namenode(NN)工作机制 NN是整个文件系统的管理节点. ...
- Linux性能监控(程序篇)
性能数据的监控,除了针对整机进行外,还要求我们对某一运行的程序单独进行.常用的程序监控命令有ps和top. Ps ps命令最常用的还是用于监控后台进程的工作情况,因为后台进程是不和屏幕键盘这些标准输入 ...
- PhoneGap检测设备网络连接情况
一.网络连接状态列表 Phonegap 网络连接通过 navigator.network.connection.type 来获取,一般有一下几种状态 1. Connection.UNKNOWN ...
- ZOJ-3261 Connections in Galaxy War---离线操作+逆序并查集
题目链接: https://cn.vjudge.net/problem/ZOJ-3261 题目大意: 给你一些点,还有一些边,每个点上都有一个权值,然后有一些询问,分为两种,query a 询问与a直 ...
- C/C++ 格式化读取和读取一行
文件内容 23 21 4 1 1 0 114 1 1 1 8 112 5 0 0 0 114 1 0 0 0 115 52 4 1 0 1 134 4 0 1 12 131 4 1 1 0 133 5 ...
- MySQL 分库分表方案,总结的非常好!
前言 公司最近在搞服务分离,数据切分方面的东西,因为单张包裹表的数据量实在是太大,并且还在以每天60W的量增长. 之前了解过数据库的分库分表,读过几篇博文,但就只知道个模糊概念, 而且现在回想起来什么 ...