大家都知道多进程的效率不是盖的,但是在python中多进程使用的时候还是有很多问题,除了怎么写之外,结果怎么拿,这些问题我们下面都需要讨论一下:
多进程的写法
方式一:使用process
for i in range(numofpage):
p = Process(target=self.save_to_mongo,args=(task_list[i*1000:(i+1)*1000]))
p.start()
process_list.append(p)
for j in process_list:
j.join()
第二种方式:使用pool
pool = Pool(processes=THTEADLINES)
for i in range(int(THTEADLINES)):
pool.apply_async(get_task, args=())
pool.close()
pool.join()
join的方式可以使得你的线程是单一输出而不是输出了一堆 由父线程来整体控制
进程间如何进行结果回传
要使用进程的结果回传需要用到一个工具叫做:
manager 它是multiprocessing中的一个包
使用时的方式如下:
在声明进程之前需要做的事情是将manager实例化
方式如下:
manager = Manager()
return_list = manager.list()
pool = Pool(processes=len(BOHAO))
for host, port in BOHAO.items():
pool.apply_async(getIpFromAdsl, args=(host, port, return_list))
pool.close()
pool.join()
return_list = list(return_list)
因为作为你的参数传递到你的主方法中 后面在你的主方法中调用就完事儿了,因为声明的是manager.list()所以后面就好list一样用就好了,追到源码除了list之外还有dict,用法都差不多,但是要记住这个是多进程中的list类,还是会有一些区别的。比如调用json的dumps方法就不行,需要你强制转换一下。