multiprocess
Queue  \ Pipe 只是实现进程间数据的传递
Manager 实现了进程间数据的共享,即多个进程可以修改同一份数据
 

进程模块 multiprocessing

#!/usr/bin/env python
# -*- coding: utf-8 -*- from multiprocessing import Process
def run(name):
print('my name is %s'% name)
if __name__ == '__main__':
p = Process(target=run,args=('lilei',))#创建一个进程实例
p.start()
#!/usr/bin/env python
#-*- coding:utf-8 -*-
# Author:DCC
from multiprocessing import Process
import multiprocessing
import time,threading
import os
def info(title):
print(title)
print('module name:', __name__)
print('parent process:', os.getppid())
print('process id:', os.getpid())
print("\n\n")
def f(name):
info('\033[31;1mfunction f\033[0m')
print('hello', name)
if __name__ == '__main__':
info('\033[32;1mmain process line\033[0m')
p = Process(target=f, args=('bob',))
p.start() def thread_run():
print(threading.get_ident())
def run(name):
time.sleep(2)
print("hello",name)
t = threading.Thread(target=thread_run,)
t.start()
if __name__ == "__main__":
for i in range(5):
p = multiprocessing.Process(target=run,args=("bob %s" %i,))
p.start()

进程号获取,父子进程关系

from multiprocessing import Process
import os def info(title): #info 函数打印父子进程
print(title)
print('module name:',__name__)
print('parent process name:',os.getppid())#打印父进程
print('child process name:',os.getpid())#打印子进程 def f(name):
info('\033[31;1m called from child process function f \033[0m')#打印f函数的父子进程
print('hello ',name) if __name__ == '__main__':
info('\033[32;1m main process \033[0m') #主程序调用info函数打印父子进程
p = Process(target=f,args=('hanmeimei',)) #主程序启动一个子进程,打印子进程的父子函数
p.start()
p.join()

进程间通信Queue,pipe

from multiprocessing import Queue,Process

def f(cq):
print('in child before cq.put:',cq.qsize()) #子进程put前查看队列中是否有数据
cq.put(['my','name','is',['lilei','xixi']]) #往队列中添加一个元素 if __name__ == '__main__':
mq = Queue() #定义进程队列实例
mq.put('fome main') #往队列中添加一个元素
p = Process(target=f,args=(mq,))#创建一个子进程,并将mq传给子进程
p.start() #启动
p.join() #等待子进程执行完毕
print('',mq.get_nowait())#获取队列元素
print('',mq.get_nowait())
from multiprocessing import  Process,Pipe

def f(conn):
conn.send("from child1") #发送数据
conn.send("from child2") #发送数据
print('client recv:',conn.recv())#接收数据
conn.close() if __name__ == '__main__':
a_conn, b_conn = Pipe() #创建管道
p = Process(target=f,args=(b_conn,)) #实例化子进程,函数f,参数管道的一端
p.start()
print(a_conn.recv())
print(a_conn.recv())
a_conn.send('from parent') #父进程发送数据
p.join()

进程间数据共享manager

from multiprocessing import Process,Manager
import os
def run(d,l):
d[os.getpid()] = os.getpid() #以当前子进程的pid为key,同时pid也作为value
l.append(os.getpid())
print(d,l) if __name__ == '__main__':
with Manager() as manager:
d = manager.dict() #manager 字典
l = manager.list() #manager 列表
p_list = [] #空的列表,为之后的添加进程实例
for i in range(10): #启动多个子进程
p = Process(target=run,args=(d,l))#起一子进程,执行run参数d,l
p.start()
p_list.append(p) #添加进程实例至列表
for r in p_list: #循环子进程
r.join() #等待子进程结束
print(d) #打印最终的字典
print(l) #打印最终的列表

进程同步

Without using the lock output from the different processes is liable to get all mixed up.

from multiprocessing import Process, Lock

def f(l, i):
l.acquire()
try:
print('hello world', i)
finally:
l.release() if __name__ == '__main__':
lock = Lock() for num in range(10):
Process(target=f, args=(lock, num)).start()

进程池 

进程池内部维护一个进程序列,当使用时,则去进程池中获取一个进程,如果进程池序列中没有可供使用的进进程,那么程序就会等待,直到进程池中有可用进程为止。

进程池中有两个方法:

  • apply
  • apply_async
from  multiprocessing import Process,Pool
import time def Foo(i):
time.sleep(2)
return i+100 def Bar(arg):
print('-->exec done:',arg) pool = Pool(5) for i in range(10):
pool.apply_async(func=Foo, args=(i,),callback=Bar)
#pool.apply(func=Foo, args=(i,)) print('end')
pool.close()
pool.join()#进程池中进程执行完毕后再关闭,如果注释,那么程序直接关闭。
#!/usr/bin/env python
#-*- coding:utf-8 -*-
# Author:DCC
from multiprocessing import Process, Pool ,freeze_support
import time
import os def Foo(i):
print("in process",os.getpid())
time.sleep(2)
return i + 100 def Bar(arg):
print('-->exec done:', arg,os.getpid()) if __name__ == "__main__":
freeze_support()
pool = Pool(3)
#pool = Pool(processes=5)
print("主进程号", os.getpid())
for i in range(10):
pool.apply_async(func=Foo, args=(i,), callback=Bar) #callback 回调,当func进行完的时候,再执行callback
# pool.apply(func=Foo, args=(i,)) print('end')
pool.close() # 必须先关闭,再join
pool.join() # 进程池中进程执行完毕后再关闭,如果注释,那么程序直接关闭。

day10---multiprocess 多进程的更多相关文章

  1. python 多线程和多进程基本写法

    #coding=utf-8 def aJob(arg): """ 提供给多线程调用 """ import threading t = thr ...

  2. python进阶之 进程编程

    1.进程 顾名思义,进程即正在执行的一个过程.进程是对正在运行程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的其他所有内 ...

  3. 自定义崩溃界面 CustomActivityOnCrash

    项目地址:https://github.com/Ereza/CustomActivityOnCrash The inner workings are based on ACRA's dialog re ...

  4. Python基础-进程和线程

    一.进程和线程的概念 首先,引出“多任务”的概念:多任务处理是指用户可以在同一时间内运行多个应用程序,每个应用程序被称作一个任务.Linux.windows就是支持多任务的操作系统,比起单任务系统它的 ...

  5. Python 基础之 线程与进程

    Python 基础之 线程与进程 在前面已经接触过了,socket编程的基础知识,也通过socketserver 模块实现了并发,也就是多个客户端可以给服务器端发送消息,那接下来还有个问题,如何用多线 ...

  6. 【python】多进程锁multiprocess.Lock

    [python]多进程锁multiprocess.Lock 2013-09-13 13:48 11613人阅读 评论(2) 收藏 举报  分类: Python(38)  同步的方法基本与多线程相同. ...

  7. 铁乐学python_Day39_多进程和multiprocess模块2

    铁乐学python_Day39_多进程和multiprocess模块2 锁 -- multiprocess.Lock (进程同步) 之前我们千方百计实现了程序的异步,让多个任务可以同时在几个进程中并发 ...

  8. 铁乐学python_Day38_多进程和multiprocess模块1

    铁乐学python_Day38_多进程和multiprocess模块1 [进程] 运行中的程序就是一个进程. 所有的进程都是通过它的父进程来创建的. 因此,运行起来的python程序也是一个进程,那么 ...

  9. day10 消息队列,多进程和多线程以及协程,异步IO,事件驱动等

    回顾一下线程和进程 线程与进程的区别 守护线程: 队列: 两种方式: 先进先出  # 后入先出   #卖水果,后来的来的是新的 生产者消费者模型: 生产包子, 吃包子 事件 event: 红绿灯模型 ...

  10. 多进程操作-进程锁multiprocess.Lock的使用

    多进程操作-进程锁multiprocess.Lock的使用 ​ 通过之前的Process模块的学习,我们实现了并发编程,虽然更加充分地利用了IO资源,但是也有缺陷:当多个进程共用一份数据资源的时候,就 ...

随机推荐

  1. otter双主同步安装与配置

    otter是阿里的开源数据同步项目,资源地址就不用说了哈,网上找,阿里云论坛关于单方向同步的配置已经很清楚了,理论上说,双主同步也不复杂,但是毕竟 是数据库,比较重要,配置双主的时候,总觉得心里没底, ...

  2. TCP发消息续传文件

    1.自定义固定协议头部.格式:([head][body][filestream]) /// <summary> /// 数据包头部 /// </summary> [Struct ...

  3. 初涉定制linux系统之——自动化安装Centos系统镜像制作

    最近碰到个需求:要在内网环境安装centos6.5系统并搭建服务,但由于自动部署脚本里安装依赖包使用的是yum安装,而服务器无法连接外网,实施人员也不会本地yum源搭建O__O "….. 本 ...

  4. NGUI 灰化按钮或图标

    在游戏中某些地方可能需要对按钮进行灰化显示,从而表示不能点击!在网上找了一下有些方法是直接用UITexture+灰化shader去做这件事!另外有些方案写的不太清楚,看不懂!不过也基本都是要使用灰化s ...

  5. JavaWeb 学习008-今日问题(非空验证尚未解决) 2016-12-2

    1. 学生模块list页面 不能正常跳转 说是找不到stuid属性,但是我在entity里面和数据库建表的属性就是stuid:Grade模块代码一样,却可以正常运行 这是什么问题? <c:for ...

  6. 不起眼的 z-index 却能牵扯出这么大的学问

    z-index在日常开发中算是一个比较常用的样式,一般理解就是设置标签在z轴先后顺序,z-index值大的显示在最前面,小的则会被遮挡,是的,z-index的实际作用就是这样. 但是你真的了解z-in ...

  7. ABAP POPUP函数

    POPUP_TO_CONFIRM_LOSS_OF_DATA 弹出一个对话框告知用户有可能丢失数据,询问是否操作继续.POPUP_TO_CONFIRM_STEP 弹出一个对话框询问用户是否操作继续. P ...

  8. 配置文件keepalived.conf详解

    keepalived.conf       一个功能比较完整的keepalived 的配置文件,其配置文件keepalived.conf 可以包含三个文本块:全局定义块.VRRP 实例定义块及虚拟服务 ...

  9. sql报句柄无效。 (异常来自 HRESULT:0x80070006 (E_HANDLE))

    是由于数据库连接资源被耗尽或者用完没被释放导致的. 我在字符串中加了启用连接池好了. 如果错误信息为:sql 无效操作.连接被关闭 也是这个问题导致的.

  10. interactivePopGestureRecognizer

    苹果一直都在人机交互中尽力做到极致,在iOS7中,新增加了一个小小的功能,也就是这个api:self.navigationController.interactivePopGestureRecogni ...