zoukankan      html  css  js  c++  java
  • 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. 参考

  • 相关阅读:
    6.简易计算器
    5.用户密码管理
    4.方法重载
    3.对象数组做参数
    2.迷你DVD管理系统
    1.二维数组计算班级成绩
    31.向数组中插入一个元素
    30.使用Arrays类的各种方法
    Java开发中的23种设计模式详解(转)
    个人代码归档
  • 原文地址:https://www.cnblogs.com/xudong-bupt/p/9369605.html
Copyright © 2011-2022 走看看