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()
    
    
  • 相关阅读:
    JavaScript cookie详解
    Javascript数组的排序:sort()方法和reverse()方法
    javascript中write( ) 和 writeln( )的区别
    div做表格
    JS 盒模型 scrollLeft, scrollWidth, clientWidth, offsetWidth 详解
    Job for phpfpm.service failed because the control process exited with error code. See "systemctl status phpfpm.service" and "journalctl xe" for details.
    orm查询存在价格为空问题
    利用救援模式破解系统密码
    SSH服务拒绝了密码
    C# 调用 C++ DLL 中的委托,引发“对XXX::Invoke类型的已垃圾回收委托进行了回调”错误的解决办法
  • 原文地址:https://www.cnblogs.com/liuxiaowei/p/7462531.html
Copyright © 2011-2022 走看看