Python多进程池 multiprocessing Pool

1. 背景

由于需要写python程序, 定时、大量发送htttp请求,并对结果进行处理。
参考其他代码有进程池,记录一下。

2. 多进程 vs 多线程

  • c++程序中,单个模块通常是单进程,会启动几十、上百个线程,充分发挥机器性能。(目前c++11有了std::thread编程多线程很方便,可以参考我之前的博客)
  • shell脚本中,都是多进程后台执行。({ ...} &, 可以参考我之前的博客,实现shell并发处理任务)
  • python脚本有多线程和多进程。由于python全局解锁锁的GIL的存在,一般建议 CPU密集型应该采用多进程充分发挥多核优势,I/O密集型可以采用多线程。

    尽管Python完全支持多线程编程, 但是解释器的C语言实现部分在完全并行执行时并不是线程安全的。
    实际上,解释器被一个全局解释器锁保护着,它确保任何时候都只有一个Python线程执行。
    GIL最大的问题就是Python的多线程程序并不能利用多核CPU的优势 (比如一个使用了多个线程的计算密集型程序只会在一个单CPU上面运行)。

3. multiprocessing pool使用例子

对Pool对象调用join()方法会等待所有子进程执行完毕,调用join()之前必须先调用close(),让其不再接受新的Process了

#coding=utf-8

import logging
import time
from multiprocessing import Pool

logging.basicConfig(level=logging.INFO, filename='logger.log')

class Point:
    def __init__(self, x = 0, y= 0):
        self.x = x
        self.y = y
    def __str__(self):
        return "(%d, %d)" % (self.x, self.y)

def fun1(point):
    point.x = point.x + 3
    point.y = point.y + 3
    time.sleep(1)
    return point

def fun2(x):
    time.sleep(1)
    logging.info(time.ctime() + ", fun2 input x:" + str(x))
    return x * x

if __name__ == '__main__':
    pool = Pool(4)

    #test1
    mylist = [x for x in range(10)]
    ret = pool.map(fun2, mylist)
    print ret

    #test2
    mydata = [Point(x, y) for x in range(3) for y in range(2)]
    res = pool.map(fun1, mydata)
    for i in res:
        print str(i)

    #end
    pool.close()
    pool.join()
    print "end"

4. 参考

原文地址:https://www.cnblogs.com/xudong-bupt/p/9369605.html

时间: 2024-10-09 11:12:24

Python多进程池 multiprocessing Pool的相关文章

python笔记——简易线程池multiprocessing.Pool

多线程模型设计是一个比较复杂的逻辑,但是python对于多线程的处理却有种种方便的类库,不需要过多的纠结线程间的操作细节.比如multiprocessing.Pool就是其中之一. 官方给的范例也很简单. from multiprocessing import Pool def f(x): return x*x if __name__ == '__main__': pool = Pool(processes=4) # start 4 worker processes result = pool.

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

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

Python多进程(multiprocessing)学习总结

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

python多进程中使用pool

Python 多进程中使用pool,pool中指定每次运行几个进程,当其中一个进程结束完毕后,会加入新的进程 #!/usr/bin/env python #coding: utf-8 import multiprocessing import os,time,random def Lee(): print "Run task Lee-%s" %(os.getpid()) #os.getpid()获取当前的进程的ID start=time.time() time.sleep(random

【python小随笔】进程池 multiprocessing.Pool的简单实现与踩过的坑

#导入进程模块 import multiprocessing #创建进程池 坑:一定要在循环外面创建进程池,不然会一直创建 pool = multiprocessing.Pool(30) for Size in Size_list: index,Size_Asin = Size.xpath('./@value')[0].split(",") Size_Asin_url = "https://www.amazon.cn/dp/%sth=1&psc=1" % S

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 多进程池

def get_html(n): time.sleep(n) print("sub_progress success") return n # 多进程池 pool = multiprocessing.Pool(multiprocessing.cpu_count()) result = pool.apply_async(get_html, args=(3,)) # 类似线程池中的sumbmit #等待所有任务完成 pool.close() # 在join前,必须先关闭,停止接收 pool

python 多进程处理 multiprocessing模块

前提: 有时候一个用一个进程处理一个列表中的每个元素(每个元素要传递到一个函数中进行处理),这个时候就要用多进程处理 1 现场案例: 我有一个[ip1,ip2,ip3,.......]这样的列表,我要每个元素ip传递给一个get_ping_info(addr)函数得到返回延迟信息,然后将结果到一保存个result列表中,如果用一个单进程执行的话可能需要几分钟,但是如果多进程处理就可以缩减几倍的速度了 用法:(程序代码只截图了部分,不可运行) pool.apply_async(函数名, (函数的参

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)