大家好,我是金鱼座,一个走在测试领域这片蓝海中, 蹉跎前行的技术渣渣,唯有一直走下去,也许能改变点什么,加油!
接着上次的通过多进程来实现多任务处理,本次使用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)
打印输出截图
image.png
如上图会停留在2,而无法执行去start m_g这个线程
解决办法就是在count_progress里面增加sleep操作,顺利执行打印20000张图片后效率提升一倍(480s-222s)
image.png