python--管道, 事件, 信号量, 进程池
一 . 管道 (了解)

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--管道, 事件, 信号量, 进程池的更多相关文章
- python之路--管道, 事件, 信号量, 进程池
一 . 管道 (了解) from multiprocessing import Process, Pipe def f1(conn): # 管道的recv 里面不用写数字 from_main_proc ...
- python之管道, 事件, 信号量, 进程池
管道:双向通信 2个进程之间相互通信 from multiprocessing import Process, Pipe def f1(conn): from_zjc_msg = conn.recv( ...
- Python 并发编程(管道,事件,信号量,进程池)
管道 Conn1,conn2 = Pipe() Conn1.recv() Conn1.send() 数据接收一次就没有了 from multiprocessing import Process,Pip ...
- python并发编程之进程2(管道,事件,信号量,进程池)
管道 Conn1,conn2 = Pipe() Conn1.recv() Conn1.send() 数据接收一次就没有了 from multiprocessing import Process,Pip ...
- day 32 管道 事件 信号量 进程池
一.管道(多个时数据不安全) Pipe 类 (像队列一样,数据只能取走一次) conn1,conn2 = Pipe() 建立管道 .send() 发送 .recv() 接收 二.事 ...
- 并发编程7 管道&事件&信号量&进程池(同步和异步方法)
1,管道 2.事件 3.信号量 4.进程池的介绍&&进程池的map方法&&进程池和多进程的对比 5.进程池的同步方法和异步方法 6.重新解释同步方法和异步方法 7.回调 ...
- python自带的进程池及线程池
进程池 """ python自带的进程池 """ from multiprocessing import Pool from time im ...
- python 管道 事件(Event) 信号量 进程池(map/同步/异步)回调函数
####################总结######################## 管道:是进程间通信的第二种方式,但是不推荐使用,因为管道会导致数据不安全的情况出现 事件:当我运行主进程的 ...
- day 32 管道,信号量,进程池,线程的创建
1.管道(了解) Pipe(): 在进程之间建立一条通道,并返回元组(conn1,conn2),其中conn1,conn2表示管道两端的连接对象,强调一点:必须在产生Process对象之前产生管道. ...
随机推荐
- scrapy框架中Download Middleware用法
scrapy框架中Download Middleware用法 Downloader Middleware处理的过程主要在调度器发送requests请求的时候以及网页将response结果返回给sp ...
- volatile关键字简单摘要
volatile就可以说是java虚拟机提供的最轻量级的同步机制 特性: 1.保证共享变量的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的——要了解主存.高速缓存还有Java内 ...
- json数据有换行符时提交不成功的坑
这是在有多行文本框表单提交时遇到的问题.. 整理所有的表达数据,合并到一个json中然后jsonp方式提交给后端时,发现只要有换行符,总是提交失败. 目前的解决办法就是在合并数据的时候把换行\n替换为 ...
- [译]Understanding ECMAScript6 函数
函数 函数是任何编程语言的重要组成部分,而自从JavaScript被引入以来,JavaScript的函数就未有太多改变.遗留下来的积压问题及微妙行为使我们很容易犯错误,或者需要更多的代码来实现一个非常 ...
- 1049 - Deg-route
http://www.ifrog.cc/acm/problem/1049 这些数学题我一般都是找规律的.. 先暴力模拟了前面的那些,然后发现(x, y) = (x, y - 1) + (x - 1, ...
- Linux 安装gcc4.8版本
1.下载安装包 http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-4.8.1/ 2.解压 .tar.gz 3.下载编译所需的依赖包 cd ...
- TI德州芯片TLV系列和TPS系列芯片区别(转)
TLV和TPS一般会有pin to pin的对应型号: 一般来讲,TPS精度.准确度和性能会好一些,所以价钱要贵一些: 对应TLV就是一样可以实现上述功能,但是精度和性能等级是稍微低一点的: 具体选择 ...
- Sqlserver 2012 Always on技术
使用了Sqlserver 2012 Always on技术后,假如采用的配置是默认配置,会出现Primary server CPU很高的情况发生,比如默认配置如下: 需要自定义来解决这个问题. 我们先 ...
- vue使用echarts可视化图形插件
1.安装echarts: cnpm/npm i echarts -S 2.main.js中 import echarts from 'echart' Vue.prototype.$echa ...
- Perl 输出内容到 excel
可以参考: http://search.cpan.org/~jmcnamara/Spreadsheet-WriteExcel/lib/Spreadsheet/WriteExcel.pm 使用Spre ...