攻克python3-进程

Posted 苦行僧PH

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了攻克python3-进程相关的知识,希望对你有一定的参考价值。

---恢复内容开始---

进程

进程是程序的一段执行过程,是个动态概念,是操作系统调度的最小单位。

multiprocessing类

Process 类用来描述一个进程对象。创建子进程的时候,只需要传入一个执行函数和函数的参数即可完成 Process 示例的创建。

  star() 方法启动进程

  join() 方法实现进程间的同步,等待所有进程退出。

  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()
View Code

管道通信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()
View Code

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 listdictNamespaceLockRLockSemaphoreBoundedSemaphoreConditionEventBarrierQueueValue 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)
View Code

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()
View Code

进程池

 

---恢复内容结束---


以上是关于攻克python3-进程的主要内容,如果未能解决你的问题,请参考以下文章

攻克python3-字典(第四篇)

学习笔记:python3,代码片段(2017)

scrapy主动退出爬虫的代码片段(python3)

scrapy按顺序启动多个爬虫代码片段(python3)

在 Python 多处理进程中运行较慢的 OpenCV 代码片段

java 简单的代码片段,展示如何将javaagent附加到运行JVM进程