multiprocessing包是Python中的多进程管理包。与threading.Thread类似,它可以利用multiprocessing.Process对象来创建一个进程。该进程可以运行在Python程序内部编写的函数。该Process对象与Thread对象的用法相同,也有start(), run(), join()的方法。此外multiprocessing包中也有Lock/Event/Semaphore/Condition类 (这些对象可以像多线程那样,通过参数传递给各个进程),用以同步进程,其用法与threading包中的同名类一致。所以,multiprocessing的很大一部份与threading使用同一套API,只不过换到了多进程的情境

调用方法一:

import multiprocessing#多进程包
import time
def visit(name):time.sleep(1)print('hello', name,time.ctime())if __name__ == '__main__':p_list=[]for i in range(3):p = multiprocessing.Process(target=visit, args=('alvin',))#创建子进程对象p_list.append(p)p.start()#开启进程for i in p_list:p.join()#与线程意义先疼痛print('end')

调用方法二:

class MyProcess(Process):def run(self):time.sleep(1)print ('hello', self.name,time.ctime())if __name__ == '__main__':p_list=[]for i in range(3):p = MyProcess()p.start()p_list.append(p)for p in p_list:p.join()print('end')

一:pid

class progress(multiprocessing.Process):def run(self):time.sleep(2)print("process name",self.name)print("parent process id",os.getppid(),time.time())print("process id",os.getpid(),time.time())
if __name__=="__main__":print("main process line")progress.run(progress)print("----------")t1=progress()t2=progress()t1.start()t2.start()#主进程的parent process id 33440 1550129555.0609472
#主进程的process id 21996 1550129555.0609472
#子进程process name progress-1parent process id 21996 1550129557.234302process id 29496 1550129557.234302

二:方法与属性

  • is_alive():返回进程是否在运行。

  • join([timeout]):阻塞当前上下文环境的进程程,直到调用此方法的进程终止或到达指定的timeout(可选参数)。

  • start():进程准备就绪,等待CPU调度

  • run():strat()调用run方法,如果实例进程时未制定传入target,这star执行t默认run()方法。

  • terminate():不管任务是否完成,立即停止工作进程

  • daemon:和线程的setDeamon功能一样

  • name:进程名字。

  • pid:进程号

一:进程队列queque

import multiprocessing,time
def foo(parad):time.sleep(1)print("子进程队列id",id(parad))parad.put("name")parad.put({"name":"alex"})
if __name__=="__main__":p_list=[]parad=multiprocessing.Queue()#创建一个进程队列print("主进程队列",id(parad))for i in range(3):progress=multiprocessing.Process(target=foo,args=(parad,))progress.start()print(parad.get())print(parad.get())

二:管道pipe

  • pipe()函数返回一对通过一个双向管道链接的链接对象  
  • parent_conn, child_conn = multiprocessing.Pipe()#创建一个管道对象
  • parent_conn.recv()#接收 parent_conn.send()#发数据
def foo(conn):time.sleep(1)conn.send("hellow father")print("子进程收:",conn.recv())conn.close()
if __name__=="__main__":parent_conn, child_conn = multiprocessing.Pipe()#创建一个管道对象progress=multiprocessing.Process(target=foo,args=(child_conn,))#将管道一方传送到子进程progress.start()print("主线程收:",parent_conn.recv())#接收数据parent_conn.send("hellow son")#发送数据progress.join()print("ending...")

  • The two connection objects returned by Pipe() represent the two ends of the pipe. Each connection object has send() and recv() methods (among others). Note that data in a pipe may become corrupted if two processes (or threads) try to read from or write to the same end of the pipe at the same time. Of course there is no risk of corruption from processes using different ends of the pipe at the same time

三:manager

Queue和pipe只是实现了数据交互,并没实现数据共享,即一个进程去更改另一个进程的数据。

A manager object returned by Manager() controls a server process which holds Python objects and allows other processes to manipulate them using proxies.

A manager returned by Manager() will support types listdictNamespaceLockRLockSemaphoreBoundedSemaphoreConditionEventBarrierQueueValue and Array. For example:

def foo(dict,list,i,string):dict["name"]="tom"list[0]=5list.append(i)string="i am tom"print("son process",id(dict),id(list))
if __name__=="__main__":with multiprocessing.Manager() as manager:dict=manager.dict({"name":"alex"})list=manager.list([1,2,3,4])string=manager.Value("i am alex")p_list=[]for i in range(2):progress=multiprocessing.Process(target=foo,args=(dict,list,i,string))p_list.append(progress)progress.start()for i in p_list:i.join()print(dict)print(list)print(string)print("father process", id(dict), id(list))

进程池内部维护一个进程序列,当使用时,则去进程池中获取一个进程,如果进程池序列中没有可供使用的进进程,那么程序就会等待,直到进程池中有可用进程为止

进程池中的方法:

  • apply 从进程池里取一个进程并同步执行
  • apply_async 从进程池里取出一个进程并异步执行
  • terminate 立刻关闭进程池
  • join 主进程等待所有子进程执行完毕,必须在close或terminete之后
  • close 等待所有进程结束才关闭线程池
·

 1 import multiprocessing,time,os
 2 def foo(i):
 3     time.sleep(1)
 4     print(i,time.time())
 5     print("son",os.getpid())#17728
 6 def success(arg):
 7     print("success",os.getpid())#18340
 8 def fail(arg):
 9     print("falid")
10 if __name__ == '__main__':
11     print("main:",os.getpid())#18340
12     pool=multiprocessing.Pool()
13     lock=multiprocessing.Lock()
14     for i in range(20):
15         pool.apply_async(func=foo,args=(i,),callback=success,error_callback=fail)
16         #pool.apply(func=foo,args=(i,))
17     pool.close()
18     pool.join()
19     print("ending....")

进程池

所谓协程又称为微线程,我们在进程在创建时, 需要耗费时间和cpu资源;在创建多线程时,也需要消耗时间和资源。利用多协程的运行过程中,始终只要一个线程, 不存在创建线程和销毁线程需要的时间; 也没有线程切换的开销, 任务需要开启线程数越多, 协程的优势越明显;更不需要多线程的锁机制(GIL)。

协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈。因此:协程能保留上一次调用时的状态(即所有局部状态的一个特定组合),每次过程重入时,就相当于进入上一次调用的状态,换种说法:进入上一次离开时所处逻辑流的位置。

协程的优点:

  (1)无需线程上下文切换的开销,协程避免了无意义的调度,由此可以提高性能(但也因此,程序员必须自己承担调度的责任,同时,协程也失去了标准线程使用多CPU的能力)

  (2)无需原子操作锁定及同步的开销

  (3)方便切换控制流,简化编程模型

  (4)高并发+高扩展性+低成本:一个CPU支持上万的协程都不是问题。所以很适合用于高并发处理。

协程的缺点:

  (1)无法利用多核资源:协程的本质是个单线程,它不能同时将 单个CPU 的多个核用上,协程需要和进程配合才能运行在多CPU上.当然我们日常所编写的绝大部分应用都没有这个必要,除非是cpu密集型应用。

  (2)进行阻塞(Blocking)操作(如IO时)会阻塞掉整个程序

def consumer(name):print("我要吃包子")while True:baozi=yieldprint("%s eating %s 包子"%(name,baozi))
def producer(name):c1.__next__()c2.__next__()n=0while True:print("\033[32;1m[producer]\033[0m is making baozi %s and %s" % (n, n + 1))c1.send(n)c2.send(n+1)n+=2if __name__ == '__main__':c1=consumer("alex")c2=consumer("tom")p1=producer("cookie")

import greenlet
def test1():print(12)g2.switch()print(34)g2.switch()print(96)
def test2():print(56)g1.switch()print(78)
g1=greenlet.greenlet(test1)#创建一个协程对象
g2=greenlet.greenlet(test2)
g1.switch()#启动协程/切换协程

gevnet是协程之间的自动切换

import gevent
def func1():print(12)gevent.sleep(2)print(56)def func2():print(34)gevent.sleep(1)print(78)
t1=gevent.spawn(func1)#创建一个线程对象
t2=gevent.spawn(func2)
print(t1)
gevent.joinall([t1,t2])#添加线程对象,并运行线程

  

  

转载于:https://www.cnblogs.com/Mr-l/p/10373862.html

python第10天(上)相关推荐

  1. 盘一盘 Python 系列 10 - Keras (上)

    本文含 12119 字,64图表截屏 建议阅读 62 分钟 0 引言 本文是 Python 系列的第十三篇,也是深度学习框架的第一篇 - Keras. 深度学习之 Keras 深度学习之 Tensor ...

  2. Python 3.10新增软关键字实现真正意义上的多分支选择结构

    推荐教材: <Python程序设计基础与应用(第2版)>(微课版)(ISBN:978-7-111-69670-4),机械工业出版社,2022年1月出版.面向新工科高等院校大数据专业系列教材 ...

  3. python 3.10上安装pyqt5

    python 3.10上安装pyqt5 前言 首先,看一下自己电脑上的python的版本,网上有太多乱七八糟的教程,啥也不说就硬教,跟着做的话就会出现稀里糊涂的报错,很耽误时间.我就是因为网上的教程痛 ...

  4. 2018.12.10:中断三个月的python学习又接上了

    2018.12.10:中断三个月的python学习又接上了 记录最近的烦心事.开心事和一般事 烦心事 小奶猫老跟我吵,本来每天挺开心的,一会去跟她聊天就搞得我动怒 英语四级马上考试,但是不想学,心里又 ...

  5. python爬取电影评分_用Python爬取猫眼上的top100评分电影

    代码如下: # 注意encoding = 'utf-8'和ensure_ascii = False,不写的话不能输出汉字 import requests from requests.exception ...

  6. 2019学习Python的10个原因

    如果你经常关注我,那你可能想知道为什么我要写一篇文章来告诉你们学习Python?但是几年前我曾向你们说过Java比Python更具有优势,哦,这就尴尬了,但确实,这几年情况有所改变,在2016年,Py ...

  7. 刚刚,Python 3.10 正式发布了,我发现了一个可怕的功能..

    就在( 2021年10月4日) Python 终于正式发布了 3.10 版本,看了下这个版本的一些特性,最受关注的应该就是 结构模式匹配 了吧?也就是大家所熟悉的 switch-case ,写错了不好 ...

  8. 独家 | Python 3.10发布——你应该知道的五大新特性

    作者:Varun Singh 翻译:欧阳锦校对:王可汗本文约1700字,建议阅读5分钟 本文为大家介绍了新版本Python的新特性. 图片来源:Canva--由Varun Singh编辑 我们都知道P ...

  9. Python 3.10的几个好用的新特性

    来源:Deephub Imba本文约1200字,建议阅读5分钟 本文为你介绍Python 3.10新的有用的特性. 3.10版没有添加新的模块,但是引入了很多新的并且有用的特性.让我们来一起看看吧. ...

  10. 【Python】刚刚,Python 3.10 正式发布了!我发现了一个可怕的功能...

    就在2021年10月4日, Python 终于正式发布了 3.10 版本,看了下这个版本的一些特性,最受关注的应该就是 结构模式匹配 了吧?也就是大家所熟悉的switch-case,写错了不好意思,是 ...

最新文章

  1. jq常用过滤器_Jquery过滤器
  2. LA3027简单带权并查集
  3. 安全性问题(数据篡改(拿到别人的URL,篡改数据(金额)发送给系统))
  4. [转载]oracle的表导入导出,表空间,用户名
  5. python序列类型包括字符串_python序列类型字符串列表元组
  6. JimuReport积木报表 — API数据源报表制作
  7. multipartfile 获取音频时长_QQ音乐移动端加入倍速播放,蓄力长音频发展 | 产品观察...
  8. 案例详解:MTU不一致导致主机和RAC不断重启
  9. 日本台式计算机配置,电脑配置
  10. WordPress如何开启用户注册功能
  11. 各种常用STL容器选择 需求分析笔记
  12. html 两个表合并,SQL中将两个表合并成一个新表
  13. html5怎么设置黑色背景及亮度,网页背景怎么设置为纯黑色css样式
  14. DMX512协议解析
  15. SpringBoot配置文件实现数据库连接
  16. 正在工作的程序员,生活状态都很苦逼?
  17. MBA回乡卖家电,谁给了他年销600万的底气?
  18. 计蒜客——恋爱纪念日(学习如何格式化打印日期)
  19. 父亲节手抄报内容大全
  20. WordPress常用模板函数 修改或自制WordPress主题必备

热门文章

  1. 详解:数据库名、实例名、ORACLE_SID、数据库域名、全局数据库名、服务名及手工脚本创建oracle数据库...
  2. 我们工作到底为了什么?
  3. 剑指Offer:包含main函数的栈(借助辅助栈)
  4. java slf4j日志框架_SLF4J - 日志框架 - 类库 - Java - 代码树
  5. 采用邻接表存储结构,编写一个判别无向图中任意给定的两个顶点之间是否存在一条长度为k的简单路径的算法。
  6. 【正一专栏】儿时的夏天——似水流年
  7. Centos下Web中间件Jboss应用发布start和stop脚本范例
  8. python报错处理_python mysql 断连报错处理
  9. python中如何打开csv文件_在Python中从CSV文件读取数据
  10. jQuery 选择器 之 案例:淘宝服饰精品案例