zoukankan      html  css  js  c++  java
  • 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
    ' %(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()
    
    
  • 相关阅读:
    杀死初创科技公司的四大工程陷阱
    杀死初创科技公司的四大工程陷阱
    Linux中su和sudo的用法整理
    Linux中su和sudo的用法整理
    Docket 使用命令
    Docker 部署 portainer
    Linux 双网卡绑定
    docker安装部署,阿里源加速
    nmcli详解
    搭建LAMP环境示例
  • 原文地址:https://www.cnblogs.com/liuxiaowei/p/7462531.html
Copyright © 2011-2022 走看看