通过继承的方式,实现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实现多进程实现复制文件的更多相关文章

  1. python基础-12 多线程queue 线程交互event 线程锁 自定义线程池 进程 进程锁 进程池 进程交互数据资源共享

    Python中的进程与线程 学习知识,我们不但要知其然,还是知其所以然.你做到了你就比别人NB. 我们先了解一下什么是进程和线程. 进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CP ...

  2. 结合Pool进程池进程,实现进程之间的通讯,稍微复杂的运用

    #进程池中的Queue """ 如果要用Pool创建进程,就需要multiprocessing.Manager()中的Queue() 而不是multiprocessing ...

  3. 进程池的同步与异步用法Pool

    进程池的同步,如下程序: from multiprocessing import Pool import time import os def func(n): print('start 进程 %s' ...

  4. 13、多进程multiprocessing、进程池

    内容相关: multiprocessing: 进程的创建与运行 进程常用相关函数 进程池: 为什么要有进程池 进程池的创建与运行:串行.并行 回调函数 多进程multiprocessing: pyth ...

  5. 进程同步控制(锁,信号量,事件), 进程通讯(队列和管道,生产者消费者模型) 数据共享(进程池和mutiprocess.Pool模块)

    参考博客 https://www.cnblogs.com/xiao987334176/p/9025072.html#autoid-1-1-0 进程同步(multiprocess.Lock.Semaph ...

  6. python 全栈开发,Day40(进程间通信(队列和管道),进程间的数据共享Manager,进程池Pool)

    昨日内容回顾 进程 multiprocess Process —— 进程 在python中创建一个进程的模块 start daemon 守护进程 join 等待子进程执行结束 锁 Lock acqui ...

  7. python全栈开发,Day40(进程间通信(队列和管道),进程间的数据共享Manager,进程池Pool)

    昨日内容回顾 进程 multiprocess Process —— 进程 在python中创建一个进程的模块 start daemon 守护进程 join 等待子进程执行结束 锁 Lock acqui ...

  8. 进程池和multiprocess.Pool模块

    一.为什么要有进程池 首先,创建进程需要消耗时间,销毁进程也需要时间.其次,即使开启了成千上万的进程,操作系统也不能让它们同时执行,这样反而会影响程序的效率.因此我们不能无限制的根据任务开启或者结束进 ...

  9. python 进程池pool

    进程池子 当你成千上万的业务需要创建成千上万的进程时,我们可以提前定义一个进程池 from multiprocessing import Pool p = Pool(10) #进程池创建方式,类似空任 ...

随机推荐

  1. C语言清空指针

    #include <stdio.h> int main() { /********************************************* * * %d int * %f ...

  2. iOS组件化开发-CocoaPods安装

    首先要检查Mac是否安装了rvm(ruby version manager).打开终端,输入指令$ rvm -v ,若没有安装 curl -L https://get.rvm.io | bash -s ...

  3. C—变量—register

    Tips 1.寄存器变量可以用来优化加速c语言程序 2.声名只需在类型前多加register 即可,eg register int quick; (quick 就是一个整形的寄存器变量) 3.regi ...

  4. vuex之module

    由于使用单一状态树,应用的所有状态会集中到一个比较大的对象.当应用变得非常复杂时,store 对象就有可能变得相当臃肿. 为了解决以上问题,Vuex 允许我们将 store 分割成模块(module) ...

  5. leetcode-数组的相对排序

    Python解法: def relativeSortArray(arr1, arr2): arr = [0 for _ in range(110)] new = [] for a in range(l ...

  6. thinkphp读取配置

    无论何种配置文件,定义了配置文件之后,都统一使用系统提供的C方法(可以借助Config单词来帮助记忆)来读取已有的配置. 获取已经设置的参数值:C('参数名称') 例如, $model = C('UR ...

  7. dvaJs使用注意事项

    项目参考地址 dva-yicha 1. 使用路由跳转的方式 (1)所有的路由跳转功能都放到 dva/router 里面的 import { routerRedux } from 'dva/router ...

  8. 语音识别(Web Speech API)

    近期看了一个语音识别的dome-----Web Speech API 本api为js调用云端接口识别 个人测试了一下,响应速度还是比较快的 注意:本API与官网需翻墙使用和访问 展示效果: 页面代码如 ...

  9. NX二次开发-UFUN关闭本地文本文档uc4540

    1 NX9+VS2012 2 3 #include <uf.h> 4 #include <uf_cfi.h> 5 #include <uf_ui.h> 6 7 us ...

  10. 牛客多校第九场 D Knapsack Cryptosystem 背包

    题意: 给你32个物品,给定一个容积,让你恰好把这个背包装满,求出装满的方案 题解: 暴力计算的话,复杂度$2^{32}$肯定会炸,考虑一种类似bsgs的算法,先用$2^{16}$的时间遍历前一半物品 ...