python多线程处理数据

python多线程处理数据,第1张

python多线程处理数据

当我们对大批量的文件进行 *** 作时,经常会用到for循环,如果数据量为10万以上的图片数据,正常的单线程 *** 作会非常慢,比如下面的简单的图片复制 *** 作,把A路径下的图片复制到B路径下,运行后,耗时很多

# -*- coding: utf-8 -*-

import time
import shutil
import os
import tqdm
import time
from loguru import logger



srcDir="/home/ff/dataset/cat"
dstDir="/home/ff/dataset/test_multithread"

def copy_file(src_dir, dst_dir):
    files = os.listdir(src_dir)
    for file in tqdm.tqdm(files):
        file_path = os.path.join(src_dir, file)
        dst_file_path= os.path.join(dst_dir,file)
        time.sleep(0.02)
        shutil.copy(file_path,dst_file_path)
t0=time.time()
copy_file(srcDir,dstDir)
t1=time.time()
logger.info(f"time is:{t1-t0}")

现在我们用多线程进行尝试,我感觉多线程 *** 作有点繁琐,尤其对于那些频繁且不通用的文件 *** 作,下面我用multiporcessing来实现多线程,看这个应用你比如把循环的变量提前得到才可以用。

# -*- coding: utf-8 -*-

import time
import shutil
import os
import time
from loguru import logger
from multiprocessing.dummy import Pool as ThreadPool


srcDir="/home/ff/dataset/cat"
dstDir="/home/ff/dataset/test_multithread"


files = os.listdir(srcDir)
def copy_file(file):
    file_path = os.path.join(srcDir, file)
    dst_file_path = os.path.join(dstDir, file)
    time.sleep(0.02)
    shutil.copy(file_path, dst_file_path)

os.mkdirs (dstDir) if not os.path.exists(dstDir) else False
pool = ThreadPool()
t_start =time.time()
pool.map(copy_file,  files)
t_end =time.time()
logger.info(f"time is :{t_end-t_start}")
pool.close()
pool.join()

结果比较:

第一个没加多线程的代码耗时大概为95s,  加了多线程的代码耗时大概6s, 大概速度提高了16倍

另一种写法,其他保持不变, 可以控制线程数,这样感觉更灵活

import multiprocessing


#todo 
p=multiprocessing.Pool(16)
t_start =time.time()
p.map(copy_file,  files)
t_end =time.time()
logger.info(f"time is :{t_end-t_start}")
p.close()
p.join()

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5521246.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-13
下一篇 2022-12-13

发表评论

登录后才能评论

评论列表(0条)

保存