攻克python3-进程
Posted 苦行僧PH
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了攻克python3-进程相关的知识,希望对你有一定的参考价值。
---恢复内容开始---
进程
进程是程序的一段执行过程,是个动态概念,是操作系统调度的最小单位。
multiprocessing类
Process 类用来描述一个进程对象。创建子进程的时候,只需要传入一个执行函数和函数的参数即可完成 Process 示例的创建。
star() 方法启动进程
j
oin() 方法实现进程间的同步,
等待所有进程退出。
close() 用来阻止多余的进程涌入进程池 Pool 造成进程阻塞。
multiprocessing.Process(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)
target 是函数名字,需要调用的函数
args 函数需要的参数,以 tuple 的形式传入
创建子进程
直接调用
from multiprocessing import Process import time def f(name): time.sleep(2) print(‘hello‘, name) if __name__ == ‘__main__‘: p = Process(target=f, args=(‘bob‘,)) p.start() p.join()
继承式调用
from multiprocessing import Process import time class MyProcess(Process): def __init__(self,name): super().__init__() self.name=name def run(self): print(‘task <%s> is runing‘ % self.name) time.sleep(2) print(‘task <%s> is done‘ % self.name) if __name__ == ‘__main__‘: p=MyProcess(‘egon‘) p.start() print(‘主‘)
与线程一样run方法必须重写
进程间通信
这里介绍只有具有亲缘关系的进程才能进行通信。
进程queue
线程queue共用内存空间
进程queue不共用内存空间,只是通过传递数据来达到进程间通信的目的
from multiprocessing import Process,Queue import threading,queue def fun(qq): qq.put("wurui") if __name__ == ‘__main__‘: q=Queue() # q=queue.Queue() p=Process(target=fun , args=(q,)) p.start() print(q.get()) p.join()
管道通信pipe
from multiprocessing import Process,Pipe def f(conn): conn.send("hello!") if __name__ == ‘__main__‘: p_conn,c_conn=Pipe() p=Process(target=f,args=c_conn) p.start() print(p_conn.recv()) p.join()
manager
A manager object returned by Manager()
controls a server process which holds Python objects and allows other processes to manipulate them using proxies.
A manager returned by Manager()
will support types list
, dict
, Namespace
, Lock
, RLock
, Semaphore
, BoundedSemaphore
, Condition
, Event
, Barrier
, Queue
, Value
and Array
. For example:
from multiprocessing import Process,Manager import os def f(d,l): d[os.getpid()]=os.getpid() l.append(os.getpid()) print(l) if __name__ == ‘__main__‘: with Manager() as m: d=m.dict() l=m.list(range(5)) p_list=[] for i in range(10): p=Process(target=f,args=(d,l)) p.start() p_list.append(p) for j in p_list: j.join() print(d) print(l)
lock(屏幕锁:防止一个进程未打印完成,另一个进程插入)
def f(l,i): l.acquire() print("hello",i) l.release() if __name__ == ‘__main__‘: l=Lock() for i in range(10): Process(target=f,args=(l,i)).start()
进程池
---恢复内容结束---
以上是关于攻克python3-进程的主要内容,如果未能解决你的问题,请参考以下文章