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) #进程池创建方式,类似空任 ...
随机推荐
- C语言结构体指针
#include <stdio.h> int main() { /*************************************************** *结构体指针:指向 ...
- 借用数组对象的prototype给数组扩充降维方法
原理:只要是一个对象,他都有一个prototype原型对象,保存共有的属性和方法. <!DOCTYPE html> <html lang="en"> < ...
- linux下alsa架构音频驱动播放wav格式文件
#include<stdio.h> #include<stdlib.h> #include <string.h> #include <alsa/asoundl ...
- linux 套接字
三.命名套接字 之前的socket只是创建了一个没有名字的资源,其他进程无法访问他.所以也无法从它接受消息.只有当bind给套接字绑定了端口和名字后,其他进程才能找到它. 一般服务器是一定要bind, ...
- 笔记41 Spring Web Flow——Demo
订购披萨的应用整体比较比较复杂,现拿出其中一个简化版的流程:即用户访问首页,然后输入电话号(假定未注册)后跳转到注册页面,注册完成后跳转到配送区域检查页面,最后再跳转回首页.通过这个简单的Demo用来 ...
- jq-demo-放大镜
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- VC++6.0环境中输出特殊字符
该方法最靠谱:https://blog.csdn.net/xiaofeilong321/article/details/8713002 输出特殊字符需使用扩展的ASCII码. 修改控制台显示设置: ( ...
- Thinkphp 3.2 去掉index.php
1.httpd.conf中去掉LoadModule rewrite_module modules/mod_rewrite.so 前面的#号 2.httpd.conf 中 AllowOverride ...
- javascript追加节点
追加节点 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3 ...
- 我们能从java的HelloWorld学到什么?
这是每个Java程序员都知道的.虽然简单,但是从一个简单的问题可以引入更深的思考.在这篇文章中,我们将讨论这个简单的程序.如果能更多的帮到你,请留下宝贵的意见. HelloWorld.java pub ...