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()
				
时间: 2024-08-07 16:45:54

Python 进程池的相关文章

python进程池剖析(一)

python中两个常用来处理进程的模块分别是subprocess和multiprocessing,其中subprocess通常用于执行外部程序,比如一些第三方应用程序,而不是Python程序.如果需要实现调用外部程序的功能,python的psutil模块是更好的选择,它不仅支持subprocess提供的功能,而且还能对当前主机或者启动的外部程序进行监控,比如获取网络.cpu.内存等信息使用情况,在做一些自动化运维工作时支持的更加全面.multiprocessing是python的多进程模块,主要

python进程池剖析(二)

之前文章中介绍了python中multiprocessing模块中自带的进程池Pool,并对进程池中的数据结构和各个线程之间的合作关系进行了简单分析,这节来看下客户端如何对向进程池分配任务,并获取结果的. 我们知道,当进程池中任务队列非空时,才会触发worker进程去工作,那么如何向进程池中的任务队列中添加任务呢,进程池类有两组关键方法来创建任务,分别是apply/apply_async和map/map_async,实际上进程池类的apply和map方法与python内建的两个同名方法类似,ap

python进程池:multiprocessing.pool

在利用Python进行系统管理的时候,特别是同时操作多个文件目录,或者远程控制多台主机,并行操作可以节约大量的时间.当被操作对象数目不大时,可以直接利用multiprocessing中的Process动态成生多个进程,十几个还好,但如果是上百个,上千个目标,手动的去限制进程数量却又太过繁琐,此时可以发挥进程池的功效.Pool可以提供指定数量的进程供用户调用,当有新的请求提交到pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求:但如果池中的进程数已经达到规定最大值,那么该请求就会

python 进程池的使用

python的线程无法很好的利用到多cpu的功能,所以大家都比较推荐多进程 下面是进程池的用法,我这里是清洗redis的过期内容 close和join一定要做,否则会占用内存 import multiprocessing def process_redis(time_range): pass # 这里不详细写了 def clear_timeout_redis(): while 1: try: p_pool = multiprocessing.Pool(processes=6) # process

python 进程池的简单使用方法

回到python,用一下python的进程池. 记得之前面试的时候,面试官问:你知道进程池的默认参数吗? 我没有回答上来,后来才知道,是有默认参数的.下面就看看它的默认参数 1. 不加参数 from multiprocessing.pool import Pool from time import sleep def fun(a): sleep(5) print(a) if __name__ == '__main__': p = Pool() # 这里不加参数,但是进程池的默认大小,等于电脑CP

python 进程池pool简单使用

平常会经常用到多进程,可以用进程池pool来进行自动控制进程,下面介绍一下pool的简单使用. 需要主动是,在Windows上要想使用进程模块,就必须把有关进程的代码写if __name__ == ‘__main__’ :语句的下面,才能正常使用Windows下的进程模块.Unix/Linux下则不需要. Pool类 Pool类可以提供指定数量的进程供用户调用,当有新的请求提交到Pool中时,如果池还没有满,就会创建一个新的进程来执行请求.如果池满,请求就会告知先等待,直到池中有进程结束, 才会

Python进程池

1 from multiprocessing import Pool 2 from time import sleep 3 def Foo(i): 4 sleep(1) 5 print(i) 6 7 8 if __name__ == "__main__": 9 #5个线程会同时执行 10 pool = Pool(5) 11 12 for i in range(50): 13 #从进程池中申请进程,还可以传入callback参数作为进程结束后的回调函数 14 pool.apply_asy

python 进程池Pool

1 #-*- coding:utf-8 -*- 2 from multiprocessing import Pool 3 import os,time,random 4 5 def long_time_task(name): 6 print 'Run task name %s and pid : %s..'%(name,os.getpid()) 7 start = time.time() 8 time.sleep(random.random()*3) 9 end = time.time() 10

python进程池pool的starmap的使用

#!/usr/bin/env python3 from functools import partial from itertools import repeat from multiprocessing import Pool, freeze_support def func(a, b): return a + b def main(): a_args = [1,2,3] second_arg = 1 with Pool() as pool: L = pool.starmap(func, [(