python提供的multiprocessing模块用于开启子进程,并在子进程中执行特定任务(eg:函数),该模块与多线程模块threading的编程接口类似。
将关键词抽取结果和其他字符串拼接并输出到文件
"""以关键词抽取为例阐述如何使用multiprocessing.Pool"""
import jieba
import jieba.analyse as analyse
from multiprocessing import Process, Pool, Lock
def main_weight(content, states):
# 利用jieba完成关键词抽取
keywords = analyse.textrank(content, topK=50, allowPOS=('n', 'v', 'vn'), withWeight=True)
return states + "," + str(keywords_dict)
def do(param):
return main_weight(param[0], param[1])
if __name__ == '__main__':
result_file = open("./result.txt", 'w', encoding='utf-8') # 结果文件
with open("./docs_states.txt", 'r', encoding='utf-8') as f: # 其他字符串
states = f.readlines()
with open("./raw_docs.txt", 'r', encoding='utf-8') as f1: # 待抽取关键词的文本
content = f1.readlines()
start1 = time.time()
param = []
for i, each_states in enumerate(states):
param.append((content[i], each_states))
pool = Pool(15) # 创建拥有15个进程数量的进程池
res = pool.map(do, param) # map(func, iterable[, chunksize=None])
end1 = time.time()
pool.close() # 关闭进程池(pool),使其不再接受新的任务
pool.join() # 主进程阻塞等待子进程的退出, join方法要在close或terminate之后使用
print("计算耗时>>>", round(end1 - start1, 2))
for i in res:
result_file.write(i+'\n')
想要快速实现自己代码的多进程运行,重点把握自己的pool.map(do, param)
,如上所示,do
就是你的函数,因为map只接收一个参数,因此如果有多个参数时,需要再写个函数把之前的函数包装一层(eg:我的main_weight
有两个参数,我写了个do
将其包装为一个函数)。之后就按照示例上的将所有数据append
到一个列表param
中,后面再跟pool.close()
和pool.join()
就OK了!!!