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) #进程池创建方式,类似空任 ...
随机推荐
- extern static和函数
#include <stdio.h> int sum(int a, int b); int main() { /************************************** ...
- Spark Streaming设计
- tf.matmul() 和tf.multiply() 的区别
1.tf.multiply()两个矩阵中对应元素各自相乘 格式: tf.multiply(x, y, name=None) 参数: x: 一个类型为:half, float32, float64, u ...
- 笔记52 Mybatis快速入门(三)
一.更多查询 1.模糊查询 修改Category.xml,提供listCategoryByName查询语句select * from category where name like concat(' ...
- window操作命令
netstat -ano 查看所有端口 netstat -ano|findstr "8005" 查看指定端口
- vue 监听的使用
watch:{ 监听的属性:function(旧值,新值) { } } 代码: <!DOCTYPE html> <html lang="en" ...
- Replication Controller、Replica Set
假如我们现在有一个Pod正在提供线上的服务,我们来想想一下我们可能会遇到的一些场景: 某次运营活动非常成功,网站访问量突然暴增 运行当前Pod的节点发生故障了,Pod不能正常提供服务了 第一种情况,可 ...
- 使用GDI+绘制的360风格按钮控件
将下面的代码拷贝到一个单元中,创建一个包,加入这个单元后安装.使用的时候设置好背景颜色,边框颜色,图标(png格式)相对路径的文件名称.这个控件可以利用PNG图像的颜色透明特性,背景色默认透明度为50 ...
- NX二次开发-char*转换成CString,多字节转换成Unicode使用方法
//定义一个结构体记录 struct group { CString text; //定义一个CString std::vector<tag_t> boudaries; std::vect ...
- char型指针的初始化问题
方法一:char *str = “abcd“区别在于你这里赋给str的是一个常量字符串,存储在静态全局区,因此str也成了一个指向常量的指针,不能通过指针对常量内容做任何更改,例如*(ch+2)='y ...