0704 Process继承实现多进程、Pool进程池,进程间通过队列通信,Pool实现多进程实现复制文件
通过继承的方式,实现Process多进程
from multiprocessing import Process
import time class MyNewProcess(Process):
def run(self):
for i in range(10):
print("----run----")
time.sleep(1) if __name__ == "__main__":
p = MyNewProcess() p.start() # Process 中的 start 方法会主动调用 run 方法
for i in range(10): print("---main---") time.sleep(1)
Pool 进程池实现多进程
import time
from multiprocessing import Pool def worker():
for i in range(10):
print("From worker %s"%i)
time.sleep(0.5) def foo():
for i in range(10):
print("From foo %s"%i)
time.sleep(0.5) def bar():
for i in range(10):
print("From bar %s"%i)
time.sleep(0.5) if __name__ == "__main__":
pool = Pool(3) # 创建三个 进程
pool.apply_async(worker)
pool.apply_async(foo)
pool.apply_async(bar) pool.close() # 关闭进程池,禁止添加任务
pool.join() # 等待子进程结束后,主进程才往下走
print("Is done...") # process and Pool 最后都是调用 fork
# 通常情况下,主进程一半用来等低啊,,,,真正的任务子进程中执行
Queue队列的简单使用
from multiprocessing import Queue
q = Queue(3) # 初始化一个Queue对象,最多可以put三条信息,如果不写3,那么久无限制
q.put("Message01") # 添加信息的方法
q.put("Message02")
print(q.full()) # 查看 队列 是否满了的方法
q.put("Message03")
print(q.full())
# 因为队列已经满了,所以下面的消息会出现异常,第一个 try 会等待2秒后再抛出异常,
# 第二个 try 会立刻抛出异常
try:
q.put("Message04", True, 2)
except:
print("消息队列已满,现有消息数量:%s"%q.qsize())
try:
q.put_nowait("Message04")
except:
print("消息队列已满,现有消息数量:%s"%q.qsize())
# 推荐使用的方式,先判断队列是否已满,再写入
if not q.full():
q.put_nowait("Message04")
# 读取消息的时候,先判断消息队列是否为空,再读取
if not q.empty():
for i in range(q.qsize()):
print(q.get_nowait())
Process配合Queue实现进程间通信
from multiprocessing import Process, Queue
import time, random # 写数据进程执行的代码
def write(q):
for value in ['a', 'b', 'c']:
print("Put %s to queue..."%value)
q.put(value)
time.sleep(random.random()) # 读数据进程的代码
def read(q):
while True:
if not q.empty():
value = q.get(True)
print("Get %s from queue..."%value)
time.sleep(random.random())
else:
break if __name__ == "__main__":
# 父进程创建 Queue, 并传给各个子进程
q = Queue()
pw = Process(target=write, args=(q, ))
pr = Process(target=read, args=(q, )) # 启动写入子进程,并等待结束
pw.start()
pw.join() # 启动读取子进程,并等待结束
pr.start()
pr.join()
进程池与队列合作实现进程间通信
# 修改 import 中的 Queue 为 Manager
from multiprocessing import Manager, Pool
import os def reader(q):
print("reader启动(%s),父进程为(%s)"%(os.getpid(), os.getppid()))
for i in range(q.qsize()):
print("reader从Queue获取到消息:%s"%q.get(True)) def writer(q):
print("writer启动(%s),父进程为(%s)"%(os.getpid(), os.getppid()))
for i in "Always":
q.put(i) if __name__ == "__main__":
print("(%s) start"%os.getpid())
q = Manager().Queue() # 使用Manager中的Queue来初始化
po = Pool()
# 使用阻塞模式创建进程,这样就不需要咋reader中使用死循环了,可以让writer完全执行后,再reader
po.apply(writer, (q,))
po.apply(reader, (q,)) po.close()
po.join()
print("(%s) End" % os.getpid())
利用Pool进程池实现简单的文件复制
import os
import time
from multiprocessing import Pool def copyFile(oldPath, newPath, fileName):
print("%s 准备复制中。。。"%fileName)
with open("%s\%s"%(oldPath, fileName), 'r') as fr, open("%s\%s"%(newPath, fileName), 'w') as fw:
for line in fr:
fw.write(line)
time.sleep(1) if __name__ == "__main__":
oldPath = r"file"
newPath = r"file-副本" os.mkdir(newPath) pool = Pool(5) fileList = os.listdir(oldPath) for fileName in fileList:
pool.apply_async(copyFile, (oldPath, newPath, fileName)) pool.close() pool.join() print("文件复制完成....")
0704 Process继承实现多进程、Pool进程池,进程间通过队列通信,Pool实现多进程实现复制文件的更多相关文章
- python基础-12 多线程queue 线程交互event 线程锁 自定义线程池 进程 进程锁 进程池 进程交互数据资源共享
Python中的进程与线程 学习知识,我们不但要知其然,还是知其所以然.你做到了你就比别人NB. 我们先了解一下什么是进程和线程. 进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CP ...
- 结合Pool进程池进程,实现进程之间的通讯,稍微复杂的运用
#进程池中的Queue """ 如果要用Pool创建进程,就需要multiprocessing.Manager()中的Queue() 而不是multiprocessing ...
- 进程池的同步与异步用法Pool
进程池的同步,如下程序: from multiprocessing import Pool import time import os def func(n): print('start 进程 %s' ...
- 13、多进程multiprocessing、进程池
内容相关: multiprocessing: 进程的创建与运行 进程常用相关函数 进程池: 为什么要有进程池 进程池的创建与运行:串行.并行 回调函数 多进程multiprocessing: pyth ...
- 进程同步控制(锁,信号量,事件), 进程通讯(队列和管道,生产者消费者模型) 数据共享(进程池和mutiprocess.Pool模块)
参考博客 https://www.cnblogs.com/xiao987334176/p/9025072.html#autoid-1-1-0 进程同步(multiprocess.Lock.Semaph ...
- python 全栈开发,Day40(进程间通信(队列和管道),进程间的数据共享Manager,进程池Pool)
昨日内容回顾 进程 multiprocess Process —— 进程 在python中创建一个进程的模块 start daemon 守护进程 join 等待子进程执行结束 锁 Lock acqui ...
- python全栈开发,Day40(进程间通信(队列和管道),进程间的数据共享Manager,进程池Pool)
昨日内容回顾 进程 multiprocess Process —— 进程 在python中创建一个进程的模块 start daemon 守护进程 join 等待子进程执行结束 锁 Lock acqui ...
- 进程池和multiprocess.Pool模块
一.为什么要有进程池 首先,创建进程需要消耗时间,销毁进程也需要时间.其次,即使开启了成千上万的进程,操作系统也不能让它们同时执行,这样反而会影响程序的效率.因此我们不能无限制的根据任务开启或者结束进 ...
- python 进程池pool
进程池子 当你成千上万的业务需要创建成千上万的进程时,我们可以提前定义一个进程池 from multiprocessing import Pool p = Pool(10) #进程池创建方式,类似空任 ...
随机推荐
- react-router踩坑
1.当用BrowserRouter时,<Link/>组件必须放在BrowserRouter里,如果是存在于某个组件里的Link,则该组件也必须放在Router里,不然会出现url改变页面为 ...
- Google 公司的代码规范
如题: C++ , Objective-C, Java, Python, R, Shell, HTML/CSS, JavaScript, AngularJS, Common Lisp ,Vimscri ...
- linux安装lolcat实现彩色文字输出信息
[root@localhost ~]# mount /dev/sr0 /media/[root@localhost ~]# rpm -ivh epel-release-latest-7.noarch. ...
- Vultr账户充值需要注意的事项
一.Vultr充值注意事项 1.选择适合自己的充值工具.我们可以使用支付宝.信用卡.PAYPAL等支付方式,需要我们注意的是充值方式不要来回切换充值,如果我们有多账户的时候一定不要相互使用,以免导致账 ...
- redis安装到本地服务的方法
要安装Redis,首先要获取安装包. Windows的Redis安装包需要到以下GitHub链接找到. 链接:https://github.com/MSOpenTech/redis 打开网站后,找到R ...
- delphi xe10 网络文件传送
//网络传送文件(类似Server/Client) TTetheringManager|设备管理.TTetheringAppProfile|文件发送 待补充
- 【NIO】NIO之浅谈内存映射文件原理与DirectMemory
Java类库中的NIO包相对于IO 包来说有一个新功能是内存映射文件,日常编程中并不是经常用到,但是在处理大文件时是比较理想的提高效率的手段.本文我主要想结合操作系统中(OS)相关方面的知识介绍一下原 ...
- 《DNS攻击防范科普系列2》 -DNS服务器怎么防DDoS攻击
在上个系列<你的DNS服务真的安全么?>里我们介绍了DNS服务器常见的攻击场景,看完后,你是否对ddos攻击忧心重重?本节我们来告诉你,怎么破局!! 首先回顾一下DDoS攻击的原理.DDo ...
- Yii2配置
最外层:配置文件,params Yii2导航 <?php NavBar::begin([ 'brandLabel' => '大海', 'brandUrl' => Yii::$app- ...
- NX二次开发-UFUN高亮显示对象UF_DISP_set_highlight
NX11+VS2013 #include <uf.h> #include <uf_modl.h> #include <uf_disp.h> UF_initializ ...