python tqdm 多线程_python中的多线程和多进程
一、简单理解一下线程和进程
在一个进程中可能存在多个线程,在不同线程之间可以通过共享内存进行通信。然而这些进程彼此之间则是完全独立且互不干扰的。例如来说 这个系统类似于火车的整体结构 每个进程相当于一列火车 而每个线程则相当于一节车厢(如数据交换)实现数据共享
二、python中的多线程和多进程
在处理大文件读写及计算任务时
先说结论,多线程适合IO密集型任务,多进程适合计算密集型任务。
在Python编程环境中处理IO操作时会触发全局解释锁(GIL)的释放。一旦GIL被释放完毕就可以执行下一个操作。因此可用线程处理后续的操作。然而若要创建新进程则需要预先分配初始化的时间与空间资源。对于计算密集型的任务使用单个线程则无法并行执行因为单个计算任务若未完成时系统不会立即释放全局解释锁导致所有线程运行成为串行模式。参考知乎上的比喻假设有一个水池内有四个抽水马桶和一个人每次只能同时使用一个设备那么这种情况下就无法提高效率但若有四个抽水马桶而一个人每次可同时使用多个设备并且每个设备的操作间隔时间满足一定的比例那么整体效率就可以达到百分之百其中间隔时间即等同于IO操作所需的等待时间从而使得多核或多线程技术得以有效应用。
很多时候python多线程加速有限,除非是IO密集型场景,如爬虫访问网页。
三、python代码
多进程:from multiprocessing import Pool
pool = Pool(5)
多线程:from multiprocessing.pool import ThreadPool
pool = TreadPool(5)
四、代码模板
注意pool.apply_async的用法(异步执行)
可视化操作用到pbar
pool.close() #关闭进程池/线程池
pool.join() #阻塞主进程,等待所有子进程结束后再运行
其他情况下,在JupyterLab进行大规模数据处理时,则会经常遇到进程间的死锁现象;同时也会面临加速效果欠佳的问题;仍然需要进一步的研究和探索。
from multiprocessing importPoolfrom multiprocessing.pool importThreadPoolimportmathimportdatetimefrom tqdm importtqdmfrom multiprocessing importPool, cpu_countimportos, time, randomdeffunc(num):
name=num#for i in tqdm(range(5), ncols=80, desc='执行任务' + str(name) + ' pid:' + str(os.getpid())):
for i in range(5):#time.sleep(random.random() * 3)
time.sleep(1)print("finished")
pbar.update()print("cpu_count():",cpu_count())
pool= Pool(10)
start=time.time()
with tqdm(total=50) as pbar:for i in (range(50)):
pool.apply_async(func, args=(i,))
pool.close()
pool.join()
end=time.time()print("\n应用多进程耗时: %0.2f seconds" % (end -start))print("over")
