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) #进程池创建方式,类似空任 ...
随机推荐
- springboot + zipkin + mysql
zipkin的数据存储可以存在4个地方: 内存(仅用于测试,数据不会持久化,zipkin-server关掉,数据就没有了) 这也是之前使用的 mysql 可能是最熟悉的方式 es Cassandra ...
- lsm和lkm模块
使用LSM Hook框架进行内核安全审计.元数据捕获,安全人员只需要按照既定的调用规范编写LKM模块,并加载进Linux内核,而不需要对system call lookup表进行任何修改 https: ...
- Ubuntu 18.04 切换使用Python3
我安装的Ubuntu 默认的python是2.7.5 python -V 我参考网上照到的文章,如果需要默认python为 python3 python命令默认是 python 3 sudo cp / ...
- Centos Apache 80 代理Tomcat 8080端口
运行环境:Centos 6.5 Apache: 2.2.5 开启apache proxy的相应模块 编辑 /etc/httpd/conf/httpd.conf文件 sudo vim /etc/http ...
- WindowsPowerShell常用命令
zai 获得Shell权限之后,可使用如下命令对系统进行文件操作: cd 后跟相应参数: cd ../ 返回上一级目录 cd +路径 跳转至制定目录(如果路径存在且正确的话) type flag.tx ...
- leetcood学习笔记-102-二叉树的层次遍历
题目描述: 方法一; class Solution(object): def levelOrder(self, root): """ :type root: TreeNo ...
- java----int,string 转化为long
String: 1.返回Long包装类型: String str = "aaa"; long l = Long.parseLong([str]); 2.返回long基本数据类型: ...
- python编写微信公众号首图思路详解
前言 之前一直在美图秀秀调整自己的微信公众号首图,效果也不尽如人意,老是调来调去,最后发出来的图片被裁剪了一大部分,丢失部分关键信息,十分恼火,于是想着用python写一个程序,把微信公众号首图的模式 ...
- Bootstrap快速入门并且建立常用模板
对于移动端,能够快速搭建网站,操作相对简单 ,更容易掌握,这篇文章就介绍一下BootStrap 一 什么是Bottstrap 一个前端开发的框架,Bootstrap,来自 Twitter,是目前很受 ...
- NX二次开发-UFUN输入Part的TAG,获取整个部件表达式的TAG和表达式个数UF_MODL_ask_exps_of_part
NX9+VS2012 #include <uf.h> #include <uf_modl.h> #include <uf_part.h> UF_initialize ...