一 . 管道 (了解)

from multiprocessing import Process, Pipe
def f1(conn):
# 管道的recv 里面不用写数字
from_main_process = conn.recv()
print('我是子程序')
print(from_main_process) if __name__ == '__main__':
# 创建一个管道,返回管道的两端conn1 和 conn2 但是只能在一边发消息,另一端接消息,自己这一段是不能接的
conn1, conn2 = Pipe()
p1 = Process(target=f1,args=(conn2,))
p1.start()
# 管道的发送里面也不用发字节
conn1.send('oh baby')
print('我是爸爸') # 数据接收一次就没有了.也就是说,往管道里面传一次消息,即使有多个进程都来接收,但是只能有一个接收成功

二 . 事件(了解)

import time
from multiprocessing import Process,Event
def f1(e):
time.sleep(2)
n = 100
print('子进程计算结果为',n)
# 将初识对象改为True
e.set()
# 查看现在的状态
print('现在的状态是->',e.is_set())
if __name__ == '__main__':
# 创建事件对象,初识状态是False
e = Event()
p = Process(target=f1,args=(e,))
p.start()
print('主进程等待...')
# e.clear() # clear 是将状态改为False
# 这个对象的状态为False的时候,就在wait的地方等待
e.wait()
print('结果已经写入文件了,可以拿到这值')

三 . 信号量(了解)

import time
import random
from multiprocessing import Process,Semaphore
def f1(i, s):
s.acquire() # 加锁
print('男嘉宾%s号到了' % i)
time.sleep(random.randint(1,3))
s.release() # 解锁 每有一个解开就会有一个进去 if __name__ == '__main__':
s = Semaphore(3) # 计数器 一起能去3个进程
for i in range(10):
p = Process(target=f1,args=(i, s))
p.start()

四. 进程池(重点)

  进程的创建和销毁是很浪费时间的,影响代码执行效率. 所以说进程池比多进程同时执行的时候会省很多时间,因为进程池没有创建和销毁这一过程.

import time
from multiprocessing import Process,Pool
def f1(n):
pass
if __name__ == '__main__':
#统计进程池执行100个任务的时间
s_time = time.time()
# 里面这个参数是指定进程池中有多少个进程用的,4表示4个进程,如果不传参数,默认开启的进程数一般是cpu的个数
pool = Pool(4)
pool.map(f1,range(100)) #参数数据必须是可迭代的,异步提交任务,自带close和join功能
e_time = time.time()
dif_time = e_time - s_time
#统计100个进程,来执行100个任务的执行时间
p_s_t = time.time() #多进程起始时间
p_list = []
for i in range(100):
p = Process(target=f1,args=(i,))
p.start()
# 要加入列表里面之后把所有的都加上join
p_list.append(p)
[pp.join() for pp in p_list]
p_e_t = time.time()
p_dif_t = p_e_t - p_s_t
print('进程池的时间:',dif_time)
print('多进程的执行时间:',p_dif_t) # 进程池的时间: 0.17912554740905762
# 多进程的执行时间: 4.200979232788086

  同步方法

import time
from multiprocessing import Process,Pool
def f1(n):
time.sleep(1)
return n*n
if __name__ == '__main__':
pool = Pool(4)
for i in range(10):
# 进程池的同步方法,将任务变成了串行
res = pool.apply(f1,args=(i,))
print(res)

  异步方法

import time
from multiprocessing import Process,Pool
def f1(n):
time.sleep(2)
return n*n
if __name__ == '__main__':
pool = Pool()
res_list = []
for i in range(5):
#异步给进程池提交任务
res = pool.apply_async(f1,args=(i,))
# print(res) # 得到的是pool对象 <multiprocessing.pool.ApplyResult object at 0x000000AEE8074668>
res_list.append(res)
print('等待所有任务执行完')
# pool.close() #锁住进程池,意思就是不让其他的程序再往这个进程池里面提交任务了,工作中一般不会锁
# pool.join()
#打印结果,如果异步提交之后的结果对象
for i in res_list:
# get()方法就是有就拿,没有就等着
print(i.get()) # 拿到的是返回结果 0,1,4,9,16

五. 回调函数

from multiprocessing import Pool,Process
def f1(n):
print('>>>>',n)
return n*n
def call_back_func(n):
print('回调函数中的结果:',n)
if __name__ == '__main__':
pool = Pool(4)
# callback就是把f1 的返回值当参数传入函数
res = pool.apply_async(f1,args=(5,),callback=call_back_func)
pool.close()
pool.join()

python--管道, 事件, 信号量, 进程池的更多相关文章

  1. python之路--管道, 事件, 信号量, 进程池

    一 . 管道 (了解) from multiprocessing import Process, Pipe def f1(conn): # 管道的recv 里面不用写数字 from_main_proc ...

  2. python之管道, 事件, 信号量, 进程池

    管道:双向通信 2个进程之间相互通信 from multiprocessing import Process, Pipe def f1(conn): from_zjc_msg = conn.recv( ...

  3. Python 并发编程(管道,事件,信号量,进程池)

    管道 Conn1,conn2 = Pipe() Conn1.recv() Conn1.send() 数据接收一次就没有了 from multiprocessing import Process,Pip ...

  4. python并发编程之进程2(管道,事件,信号量,进程池)

    管道 Conn1,conn2 = Pipe() Conn1.recv() Conn1.send() 数据接收一次就没有了 from multiprocessing import Process,Pip ...

  5. day 32 管道 事件 信号量 进程池

    一.管道(多个时数据不安全)   Pipe 类 (像队列一样,数据只能取走一次) conn1,conn2 = Pipe()     建立管道 .send()   发送 .recv()   接收 二.事 ...

  6. 并发编程7 管道&事件&信号量&进程池(同步和异步方法)

    1,管道 2.事件 3.信号量 4.进程池的介绍&&进程池的map方法&&进程池和多进程的对比 5.进程池的同步方法和异步方法 6.重新解释同步方法和异步方法 7.回调 ...

  7. python自带的进程池及线程池

    进程池 """ python自带的进程池 """ from multiprocessing import Pool from time im ...

  8. python 管道 事件(Event) 信号量 进程池(map/同步/异步)回调函数

    ####################总结######################## 管道:是进程间通信的第二种方式,但是不推荐使用,因为管道会导致数据不安全的情况出现 事件:当我运行主进程的 ...

  9. day 32 管道,信号量,进程池,线程的创建

    1.管道(了解) Pipe(): 在进程之间建立一条通道,并返回元组(conn1,conn2),其中conn1,conn2表示管道两端的连接对象,强调一点:必须在产生Process对象之前产生管道. ...

随机推荐

  1. C# 面向对象之继承

    Object是所有类的基类 1.在C#中一个类可以继承另一个类(密封类除外,静态类是密封的不能被继承); 2.被继承的类被成为基类(父类);继承的类被成为派生类(子类); 3.子类将获得父类除构造函数 ...

  2. Solr的SolrCloud与Master-slave主从模式对比

    第一印象 SolrCloud是Solr4.0引入的,主要应对与商业场景.它很像master-slave,却能自动化的完成以前需要手动完成的操作.利用ZooKeeper这个工具去监控整个Solr集群,以 ...

  3. Unity Shader入门精要学习笔记 - 第6章 开始 Unity 中的基础光照

    转自冯乐乐的<Unity Shader入门精要> 通常来讲,我们要模拟真实的光照环境来生成一张图像,需要考虑3种物理现象. 首先,光线从光源中被发射出来. 然后,光线和场景中的一些物体相交 ...

  4. 【学习笔记】js中undefined和null的区别和联系

    在JavaScript中存在这样两种原始类型:Null与Undefined.这两种类型常常会使JavaScript的开发人员产生疑惑,在什么时候是Null,什么时候又是Undefined? Undef ...

  5. html5.0学习记录(一)——可拖动视频播放器

    最近自己在重新学习html5新特性,了解到有视频标签和拖动标签,于是自己用这两个特性写了一个小demo,主要功能就是可以通过拖动视频来直接播放.效果图如下: 页面使用了<video>标签和 ...

  6. linux_base-f10-10_7 linuxulator is not (kld)loaded

    # cd linux_base-f10/# make install clean===>  linux_base-f10-10_7 linuxulator is not (kld)loaded. ...

  7. [Ubuntu]“ubuntu.sh: 113: ubuntu.sh:Syntax error: "(" unexpected ”报错解决方法

    原因:有可能是兼容性问题 解决方法: 1.sudo dpkg-reconfigure dash   2.在弹出的窗口选择no

  8. MySQL的information_schema的介绍(转)

    转自:http://www.cnblogs.com/hzhida/archive/2012/08/08/2628826.html, 大家在安装或使用MYSQL时,会发现除了自己安装的数据库以外,还有一 ...

  9. js 双向绑定

    //双向绑定实例 <input name="" ng-bind-123="name" /> function DataBinder( object_ ...

  10. CloudFoundry命令行和Kubernetes命令行的Restful API消费方式

    先说CloudFoundry的命令行工具CLI.我们在CloudFoundry环境下工作,第一个使用的命令就是cf login. 如果在环境变量里维护CF_TRACE的值为true: 则我们能发现,诸 ...