Python 进程池

Posted

tags:

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

一、定义:

  多进程是实现并发的手段之一,在利用Python进行系统管理的时候,特别是同时操作多个文件目录,或者远程控制多台主机,并行操作可以节约大量的时间。                      Pool([numprocess [,initializer [, initargs]]]):创建进程池 

二、主要参数:

  1 numprocess:要创建的进程数,如果省略,将默认使用cpu_count()的值
  2 initializer:是每个工作进程启动时要执行的可调用对象,默认为None
  3 initargs:是要传给initializer的参数组

三、主要方法:

p.apply(func [, args [, kwargs]]):在一个池工作进程中执行func(*args,**kwargs),然后返回结果。需要强调的是:此操作并不会在所有池工作进程中并执行func函数。如果要通过不同参数并发地执行func函数,必须从不同线程调用p.apply()函数或者使用p.apply_async()
p.apply_async(func [, args [, kwargs]]):在一个池工作进程中执行func(*args,**kwargs),然后返回结果。此方法的结果是AsyncResult类的实例,callback是可调用对象,接收输入参数。当func的结果变为可用时,将理解传递给callback。callback禁止执行任何阻塞操作,否则将接收其他异步操作中的结果。
   
p.close():关闭进程池,防止进一步操作。如果所有操作持续挂起,它们将在工作进程终止前完成
P.jion():等待所有工作进程退出。此方法只能在close()或teminate()之后调用

四、其它方法:

方法apply_async()和map_async()的返回值是AsyncResul的实例obj。实例具有以下方法
obj.get():返回结果,如果有必要则等待结果到达。timeout是可选的。如果在指定时间内还没有到达,将引发一场。如果远程操作中引发了异常,它将在调用此方法时再次被引发。
obj.ready():如果调用完成,返回True
obj.successful():如果调用完成且没有引发异常,返回True,如果在结果就绪之前调用此方法,引发异常
obj.wait([timeout]):等待结果变为可用。
obj.terminate():立即终止所有工作进程,同时不执行任何清理或结束任何挂起工作。如果p被垃圾回收,将自动调用此函数

五、实例:

from multiprocessing import Pool
import os,time

def work(n):
    print(task <%s> is runing %os.getpid())
    time.sleep(2)
    return n**2
if __name__ == __main__:
    # print(os.cpu_count())
    p=Pool(4) # 并行执行几个进程
    # for i in range(10):
    #     res=p.apply(work,args=(i,))
    #     print(res)

    res_l=[]
    for i in range(10):
        res=p.apply_async(work,args=(i,))
        res_l.append(res)

    p.close()
    p.join()
    #
    # for res in res_l:
    #     print(res.get())

六、回调函数:

import requests #pip3 install requests
import os,time
from multiprocessing import Pool
def get_page(url):
    print(<%s> get :%s %(os.getpid(),url))
    respone = requests.get(url)
    if respone.status_code == 200:
        return {url:url,text:respone.text}

def parse_page(dic):
    print(<%s> parse :%s %(os.getpid(),dic[url]))
    time.sleep(0.5)
    res=url:%s size:%s\n %(dic[url],len(dic[text])) #模拟解析网页内容
    with open(db.txt,a) as f:
        f.write(res)


if __name__ == __main__:
    p=Pool(4)
    urls = [
        http://www.baidu.com,
        http://www.baidu.com,
        http://www.baidu.com,
        http://www.baidu.com,
        http://www.baidu.com,
        http://www.baidu.com,
        http://www.baidu.com,
    ]


    for url in urls:
        p.apply_async(get_page,args=(url,),callback=parse_page) #callback 则把得到的结果传给了回调味函数进行处理


    p.close()
    p.join()
    print(主进程pid:,os.getpid())

七、进程池控制套字节的并发通信实例

#客户端
from socket import *
c=socket(AF_INET,SOCK_STREAM)
c.connect((127.0.0.1,8080))

while True:
    msg=input(>>: ).strip()
    if not msg:continue
    c.send(msg.encode(utf-8))
    data=c.recv(1024)
    print(data.decode(utf-8))

c.close()
#服务端
from
multiprocessing import Pool import os from socket import * s=socket(AF_INET,SOCK_STREAM) s.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) s.bind((127.0.0.1,8080)) s.listen(5) def talK(conn,addr): print(os.getpid()) while True: try: data=conn.recv(1024) if not data:break conn.send(data.upper()) except Exception: break conn.close() if __name__ == __main__: p=Pool(4) while True: conn,addr=s.accept() p.apply_async(talK,args=(conn,addr)) s.close()

 


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

Python 37 进程池与线程池 协程

Python进程池和线程池

python的学习之旅---进程和进程池

python进阶多进程(进程池,进程间通信)

Python入门学习-DAY37-进程池与线程池协程gevent模块

python_进程池以及线程池