多线程模型设计是一个比较复杂的逻辑,但是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.apply_async(f, [10]) # evaluate "f(10)" asynchronously print result.get(timeout=1) # prints "100" unless your computer is *very* slow print pool.map(f, range(10)) # prints "[0, 1, 4,..., 81]"
并未做太多的详细解释。正好我手头有一段代码,需要请求几百个url,解析html页面获取一些信息,单线程for循环效率极低,因此看到了这个模块,想用这个实现多线程分析,参考代码如下:
from multiprocessing import Pool def analyse_url(url): #do something with this url return analysis_result if __name__ == ‘__main__‘: pool = Pool(processes=10) result = pool.map(analyse_url, url_list)
确实比以前单线程for循环url_list列表,一个个请求analyse_url要快得多,但是带来的问题就是一旦pool.map没执行完就ctrl-c
中断程序,程序就会异常,永远无法退出,参考stackoverflow的这个帖子,修改为以下代码:
#result = pool.map(analyse_url, url_list) result = pool.map_async(analyse_url, url_list).get(120)
至此问题完美解决
python笔记——简易线程池multiprocessing.Pool
时间: 2024-10-07 18:02:31