python协程处理海量文件_python_实战篇_使用协程gevent模块实现多任务copyA文件夹到B文件夹...
大家好,我是金魚座,一個走在測試領域這片藍海中, 蹉跎前行的技術渣渣,唯有一直走下去,也許能改變點什么,加油!
接著上次的通過多進程來實現多任務處理,本次使用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
總結
以上是生活随笔為你收集整理的python协程处理海量文件_python_实战篇_使用协程gevent模块实现多任务copyA文件夹到B文件夹...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么利用Flash制作可爱的小丑吹泡泡动
- 下一篇: python循环五要素_python常见