python协程处理海量文件_python_实战篇_使用协程gevent模块实现多任务copyA文件夹到B文件夹...
大家好,我是金魚座,一個(gè)走在測試領(lǐng)域這片藍(lán)海中, 蹉跎前行的技術(shù)渣渣,唯有一直走下去,也許能改變點(diǎn)什么,加油!
接著上次的通過多進(jìn)程來實(shí)現(xiàn)多任務(wù)處理,本次使用gevent來實(shí)現(xiàn)協(xié)程的多任務(wù)處理
閑話不說上代碼:
#!/usr/bin/python3
# -*- coding: utf-8 -*-
"""
@File : abc_test.py
@Author: JACK
@Date : 2019/8/12
@Des :
"""
"""
使用多任務(wù),來copy文件到指定的目錄下(協(xié)程版本)
"""
import os
# import multiprocessing
import time
import gevent
from gevent import monkey
import threading
old_folder_name = 'E:\\2jack項(xiàng)目\\2W_small_imgs'
new_folder_name = 'E:\\2jack項(xiàng)目\\2W_small_imgs_1'
tasklist = [] # 定義一個(gè)任務(wù)列表
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()
# 創(chuàng)建一個(gè)新的文件
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)
# 創(chuàng)建目錄
def mkdir_folder():
try:
os.mkdir(new_folder_name)
print("創(chuàng)建文件夾{}成功".format(new_folder_name))
except:
pass
# 執(zhí)行單位
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 當(dāng)前執(zhí)行進(jìn)度{: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("耗時(shí){}".format((end_time-start_time)))
此處說個(gè)好玩的事情,在我用多線程來進(jìn)行執(zhí)行count_progress時(shí),由于在while True中沒有加time.sleep()操作,導(dǎo)致我啟動的另外一個(gè)線程執(zhí)行main_gevent一直得不到cpu的調(diào)度執(zhí)行
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,而無法執(zhí)行去start m_g這個(gè)線程
解決辦法就是在count_progress里面增加sleep操作,順利執(zhí)行打印20000張圖片后效率提升一倍(480s-222s)
image.png
總結(jié)
以上是生活随笔為你收集整理的python协程处理海量文件_python_实战篇_使用协程gevent模块实现多任务copyA文件夹到B文件夹...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么利用Flash制作可爱的小丑吹泡泡动
- 下一篇: FLASH怎么制作一个七彩折扇开合的动画