1.多线程与多进程
1.1 是什么?
多线程用一个CPU跑多个线程;
多进程用多个CPU跑,每个CPU跑一个线程。
1.2 怎么选?
计算密集用多进程,IO密集用多线程。
2. 怎么用?
2.1 多进程
from multiprocessing import Pool #多进程
arr1 = [1,3123,521,123,12321,77,116]
def test_func(i):
#测试使用的函数
while True:
i=i*i
pool = Pool(5)# 开5个进程,没有参数时默认是 cpu 的核心数
results = pool.map(test_func, arr1)# 在进程中执行 test_func
pool.close() #需要关闭进程池,防止池其他任务的提交,注意!这里不是关闭进程。简单来说就是关掉了屋外的大门,但是各个房间在运行。
pool.join() #等待进程池里面的进程运行完
使用时遇见的小问题:在win10电脑jupyter开不了多进程(求解),直接运行py文件就可以;在linux上jupyter可以多进程。
2.2 多线程
from threading import Thread #多线程
arr1 = [1,3123,521,123,12321,77,116]
def test_func(i):
#测试使用的函数
print(i)
ts = []
for i in range(15):
# target指定线程要执行的代码,args指定该代码的参数
th = threading.Thread(target=test_func, args=(i,))
ts.append(th)
#开炮
for i in ts:
i.start()
# 此处的join函数使子线程全部跑完再继续往下跑子线程
for i in ts:
i.join()
print("it is end !")
Pandas多进程
1.在apply前加swifter
import swifter
df.swifter.apply(XXXXX)
2.pandarallel
from pandarallel import pandarallel
pandarallel.initialize(nb_workers=20)#nb_workers=进程数
df.parallel_apply(xxxxx)
嵌套循环改多进程案例
修改前:
from collections import defaultdict
from tqdm.notebook import tqdm
pmid_relations=defaultdict(set)
for pmid,EntitySet in tqdm(pmid_EntitySet.items(),total=len(pmid_EntitySet)):
for relation,RelationId in DiseaseGene_RelationId.items():
if set(relation).issubset(EntitySet):
pmid_relations[pmid].add((relation,RelationId))
修改后:
from multiprocessing import Pool
from collections import defaultdict
from tqdm.notebook import tqdm
def process(pmid_EntitySet_item):
pmid, EntitySet = pmid_EntitySet_item
relations = set()
for relation, re_id in DiseaseGene_RelationId.items():
if set(relation).issubset(EntitySet):
relations.add((relation, re_id))
return pmid, relations
pmid_relations = defaultdict(set)
with Pool() as pool:
for pmid, relations in tqdm(pool.imap_unordered(process, pmid_EntitySet.items()), total=len(pmid_EntitySet)):
pmid_relations[pmid] = relations
#参考文献
1.【Python】使用 multiprocessing.dummy 执行多线程任务https://blog.csdn.net/ns2250225/article/details/48755741
2. python3多进程阻塞与非阻塞快速理解https://blog.csdn.net/qq_41562377/article/details/105219269
3. Python多线程:Threading中join()函数的理解https://blog.csdn.net/xinghen1993/article/details/100691562