python 多进程处理 multiprocessing模块

前提: 有时候一个用一个进程处理一个列表中的每个元素(每个元素要传递到一个函数中进行处理),这个时候就要用多进程处理

1 现场案例:

我有一个[ip1,ip2,ip3,.......]这样的列表,我要每个元素ip传递给一个get_ping_info(addr)函数得到返回延迟信息,然后将结果到一保存个result列表中,如果用一个单进程执行的话可能需要几分钟,但是如果多进程处理就可以缩减几倍的速度了

用法:(程序代码只截图了部分,不可运行)

pool.apply_async(函数名, (函数的参数1,函数的参数2,函数的参数3))
import multiprocessing
def get_ping_info(create_time,prov,city,net_type,addr):
    result = ping.quiet_ping(addr, timeout=2, count=5, psize=64)
    loss_rate = result[0]
    max_time = float(‘%.3f‘% result[1]) if isinstance(result[1], float) else 0
    #if max_time and average_time is None use 0
    average_time = float(‘%.3f‘% result[1]) if isinstance(result[2], float) else 0
    print create_time,prov,city,net_type,loss_rate, average_time
    return (create_time,prov,city,net_type,loss_rate, average_time)
if __name__ == "__main__":
    all_city_result_tmp = []
    all_city_result = []
    create_time = datetime.now()
    city_list = get_city_list()
    pool = multiprocessing.Pool(processes=4)
    for prov,city,addr in city_list:
        all_city_result_tmp.append(pool.apply_async(get_ping_info, (create_time,prov,city,‘CTC‘,addr )))
    pool.close()
    pool.join()
    for city_info in all_city_result_tmp:
        #print city_info.get()
        all_city_result.append(city_info.get())

注意:

1 all_city_result_tmp 只是多线程多线的列表,其中列表中的元素.get() 函数才会去执行元素对象,对象中有执行get_ping_info函数的信息和返回值

时间: 2024-11-02 18:37:42

python 多进程处理 multiprocessing模块的相关文章

Python多进程(multiprocessing)学习总结

简介 multiprocessing模块使用和threading包类似的API接口来产生多进程,multiprocessing包提供本地和远程的并发,通过使用subprocesses(子进程)代替threads(线程)有效的避开了GIL(Global Interpreter Lock).由于这一点,multiprocessing模块允许程序充分的利用多处理器.可以跨平台使用,包括Unix和Windows!----https://docs.python.org/2/library/multipro

Python多进程并发(multiprocessing)用法实例详解

http://www.jb51.net/article/67116.htm 本文实例讲述了Python多进程并发(multiprocessing)用法.分享给大家供大家参考.具体分析如下: 由于Python设计的限制(我说的是咱们常用的CPython).最多只能用满1个CPU核心.Python提供了非常好用的多进程包multiprocessing,你只需要定义一个函数,Python会替你完成其他所有事情.借助这个包,可以轻松完成从单进程到并发执行的转换. 1.新建单一进程 如果我们新建少量进程,

Python多进程(multiprocessing)

Unix/Linux操作系统提供了一个fork()系统调用,它非常特殊.普通的函数调用,调用一次,返回一次,但是fork()调用一次,返回两次,因为操作系统自动把当前进程(称为父进程)复制了一份(称为子进程),然后,分别在父进程和子进程内返回. 子进程永远返回0,而父进程返回子进程的ID.这样做的理由是,一个父进程可以fork出很多子进程,所以,父进程要记下每个子进程的ID,而子进程只需要调用getppid()就可以拿到父进程的ID. Python的os模块封装了常见的系统调用,其中就包括for

Python多进程池 multiprocessing Pool

1. 背景 由于需要写python程序, 定时.大量发送htttp请求,并对结果进行处理. 参考其他代码有进程池,记录一下. 2. 多进程 vs 多线程 c++程序中,单个模块通常是单进程,会启动几十.上百个线程,充分发挥机器性能.(目前c++11有了std::thread编程多线程很方便,可以参考我之前的博客) shell脚本中,都是多进程后台执行.({ ...} &, 可以参考我之前的博客,实现shell并发处理任务) python脚本有多线程和多进程.由于python全局解锁锁的GIL的存

Python进程之multiprocessing模块

python的multiprocessing模块是跨平台的多进程模块,multiprocessing具有创建子进程,进程间通信,队列,事件,锁等功能,multiprocessing模块包含Process,Queue,Pipe,Lock等多个组件. 1.Process 创建进程的类 Process([group [, target [, name [, args [, kwargs]]]]]) 参数介绍:group参数未使用,值始终为Nonetarget表示调用对象,即子进程要执行的任务args表

Python之进程 - multiprocessing模块

? 我们已经了解了,运行中的程序就是一个进程.所有的进程都是通过它的父进程来创建的.因此,运行起来的python程序也是一个进程,那么我们也可以在程序中再创建进程.多个进程可以实现并发效果,也就是说,当我们的程序中存在多个进程的时候,在某些时候,就会让程序的执行速度变快.以我们之前所学的知识,并不能实现创建进程这个功能,所以我们就需要借助python中强大的模块. ? 仔细说来,multiprocess不是一个模块而是python中一个操作.管理进程的包. 之所以叫multi是取自multipl

Python多进程并发(multiprocessing)

A manager returned by Manager() will support types list, dict, Namespace, Lock, RLock, Semaphore, BoundedSemaphore, Condition, Event, Queue, Value and Array. For example, from multiprocessing import Process, Manager def f(d, l): d[1] = '1' d['2'] = 2

python 中的multiprocessing 模块

multiprocessing.Pipe([duplex]) 返回2个连接对象(conn1, conn2),代表管道的两端,默认是双向通信.如果duplex=False,conn1只能用来接收消息,conn2只能用来发送消息.不同于os.open之处在于os.pipe()返回2个文件描述符(r, w),表示可读的和可写的 实例如下: #!/usr/bin/python #coding=utf-8 import os from multiprocessing import Process, Pip

Python多进程(multiprocessing)共享变量

#!/usr/bin/env python2 # coding: utf8 import multiprocessing def foo(h,context): if h%2 == 0: print (h) else: context.append(h) if __name__ == "__main__": ## 设置共享list con = multiprocessing.Manager().list() ## 设置进程池大小 p = multiprocessing.Pool(2)