由于性能需要。加上没有使用集群,因此在代码中使用了多线程,但是由于python中全局解释锁GIL的存在造成使用多线程的时候并不能起到作用,在使用threadpool时,设置线程数并不能起到作用。
因此应该使用多进程才是正确的,使用multiprocessing库可以使用多进程的方式使用之。不过使用的时候要确保能异步执行的,先将数据分成n份,然后将线程再分成n个,每个线程执行一份数据,最后将结果合并。
如下所示:
#数据文件为hu_data
hu_data=func(...)
hu_all = list()
hu_len = len(hu_data)
t = 8
#切分数据
for x in range(t):
hu_all.append(hu_data[round(hu_len*x/t):round(hu_len*(x+1)/t)])
#启动进程
pool = multiprocessing.Pool(processes=t)
result = list()
for i in hu_all:
result.append(pool.apply_async(func, (i,)))
pool.close()
pool.join()
#拼接结果
re = list()
for i in result:
for k in i.get():
re.append(k)
PS:粗俗的将同步是指当前所做的事情过度依赖前面的事情,如果前面的事情没有做好,那么当前会处于阻塞状态;而异步是指当前所做的事情并不依赖前面的事情,因此不会引起阻塞。