python中的多线程和多进程
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
如果使用multiprocessing模块是相当简单的,通过进程池或线程池来限定并发的数量。
创建多进程和多线程的语法是一样的,只需要将Pool替换为ThreadPool即可将多进程替换为多线程。
from multiprocessing import Pool # 进程池
from multiprocessing.dummy import Pool as ThreadPool # 线程池
def do_something(args):
# 注意,如果有多个参数,需要包装成一个tuple传入
param1,param2 = args
#获取当前线程的名字
name = multiprocessing.current_process().name
print('process=%s, p1=%d, p2=%d' %(name, param1,param2))
return n*2
def main():
# 注意,如果需要传入过个参数,需要整理成tuple格式
# task是一个可迭代对象,传入需要计算的参数
task=[(1,11),(2,22),(3,33),(4,44),(5,55),(6,66),(7,77)]
# 多进程示例
pool = Pool(4) # 开4个核
result = pool.map(do_something, task) # 将每个进程的结果组成list
pool.close() # 关闭进程池(pool),使其不在接受新的任务
pool.join() # 等待子进程结束
# 多线程示例
pool = ThreadPool(20) # 20个线程
result = pool.map(do_something, task)
pool.close()
pool.join()
if __name__ == '__main__':
main()
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
有些资料说,要将多进程多线程pool.map写在if __name__ == '__main__'后面才能运行,后来发现不用。
但是,在RELP模式下肯定是不会成功的。
参考
小奋斗文章
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~