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" 
 
发布评论
IT源码网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

log4j配置详解讲解
你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。