python协程处理海量文件_python——使用协程gevent模块实现多任务copyA文件夹到B文件夹-Go语言中文社区...

大家好,我是金鱼座,一个走在测试领域这片蓝海中, 蹉跎前行的技术渣渣,唯有一直走下去,也许能改变点什么,加油!

接着上次的通过多进程来实现多任务处理,本次使用gevent来实现协程的多任务处理

闲话不说上代码:

#!/usr/bin/python3

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

"""

@File : abc_test.py

@Author: JACK

@Date : 2019/8/12

@Des :

"""

"""

使用多任务,来copy文件到指定的目录下(协程版本)

"""

import os

# import multiprocessing

import time

import gevent

from gevent import monkey

import threading

old_folder_name = 'E:\2jack项目\2W_small_imgs'

new_folder_name = 'E:\2jack项目\2W_small_imgs_1'

tasklist = [] # 定义一个任务列表

count = []

file_names = os.listdir(old_folder_name)

# copy file

def copy_file_gevent(file_name):

old_file_path = os.path.join(old_folder_name, file_name)

# 把旧的东西读出来

file = open(old_file_path, 'rb')

content = file.read()

file.close()

# 创建一个新的文件

new_file_path = os.path.join(new_folder_name, file_name)

# 在新的里面写入

new_file = open(new_file_path, 'wb')

new_file.write(content)

new_file.close()

count.append(1)

# 创建目录

def mkdir_folder():

try:

os.mkdir(new_folder_name)

print("创建文件夹{}成功".format(new_folder_name))

except:

pass

# 执行单位

def main_gevent():

tasklist.append(gevent.spawn(count_progress))

for file in file_names:

tasklist.append(

gevent.spawn(copy_file_gevent, file)

)

gevent.joinall(tasklist)

def count_progress():

while True:

time.sleep(0.5)

if len(count) >= len(file_names):

break

else:

print("r 当前执行进度{:2f}%".format((len(count)*100/len(file_names))), end="")

if __name__ == "__main__":

monkey.patch_all()

start_time = time.time()

mkdir_folder()

main_gevent()

end_time = time.time()

print("耗时{}".format((end_time-start_time)))

此处说个好玩的事情,在我用多线程来进行执行count_progress时,由于在while True中没有加time.sleep()操作,导致我启动的另外一个线程执行main_gevent一直得不到cpu的调度执行

count_thr = threading.Thread(target=count_progress)

print(1)

m_g = threading.Thread(target=main_gevent)

main_gevent()

print(2)

count_thr.start()

print(3)

m_g.start()

print(4)

打印输出截图

ccf5a3d2274c8e3aa97e5116b3eb22d7.png

image.png

如上图会停留在2,而无法执行去start m_g这个线程

解决办法就是在count_progress里面增加sleep操作,顺利执行打印20000张图片后效率提升一倍(480s-222s)

c617da83cf7ab8d9c88951e697ccddbe.png

image.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值