最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python多線程如何同時(shí)處理多個(gè)文件

 更新時(shí)間:2023年08月14日 11:35:23   作者:DS..  
這篇文章主要介紹了Python多線程如何同時(shí)處理多個(gè)文件問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Python多線程同時(shí)處理多個(gè)文件

在需要對(duì)大量文件進(jìn)行相同的操作時(shí),逐個(gè)遍歷是非常耗費(fèi)時(shí)間的。這時(shí),我們可以借助于Python的多線程操作來大大提高處理效率,減少處理時(shí)間。

問題背景

比如說,我們現(xiàn)在需要從一個(gè)文件夾下面讀取出所有的視頻,然后對(duì)每個(gè)視頻進(jìn)行逐幀處理。

由于對(duì)視頻逐幀處理本身就是比較耗時(shí)的任務(wù),如果按照串行的方式順序處理每個(gè)視頻文件是效率非常低的,此時(shí),一種比較容易的解決方案是使用Python的多線程進(jìn)行處理。

定義通用處理函數(shù)

并發(fā)適合于處理相似的任務(wù)。例如我們需要對(duì)視頻中的每一幀進(jìn)行處理,處理函數(shù)接受的是一個(gè)視頻名稱的列表,對(duì)列表內(nèi)的視頻順序處理,那么我們可以構(gòu)建以下處理函數(shù):

import cv2
def func(video_names):
? ? for video_name in video_names:
? ? ? ? cap = cv2.VideoCapture(video_name)
? ? ? ? while True:
? ? ? ? ? ? ret, frame = cap.read()
? ? ? ? ? ? if ret:
? ? ? ? ? ? ? ? # process temp frame
? ? ? ? ? ? else:
? ? ? ? ? ? ? ? break

這樣,我們只需要將待處理的視頻名稱按照開啟的線程數(shù),劃分成多個(gè)子列表,就可以進(jìn)行并發(fā)批量處理了。

多線程 Thread

Python中的多線程是通過threading庫實(shí)現(xiàn)的,除此之外,multiprocessing也可以實(shí)現(xiàn)并發(fā)處理,二者之間是存在一定差異的。這里我們使用threading來實(shí)現(xiàn)同時(shí)處理多個(gè)不同的文件。

import threading
# video_names_list = [part_names_1_list, part_names_2_list, ..., part_names_k_list]
for part_video in video_names_list:
? ? thread = threading.Thread(target=func, args=([part_video]))
? ? thread.start()

在這里,首先將要處理的文件名稱列表劃分成若干個(gè)子列表,然后對(duì)每一個(gè)子列表開啟一個(gè)線程進(jìn)行處理。

Python多線程文件操作

使用python 將在csv文件中的一百萬條網(wǎng)址,寫入mongo數(shù)據(jù)庫中,這里使用多線程進(jìn)行操作。

直接貼上代碼,如下:

import os
import threading ?#導(dǎo)入進(jìn)程
import csv
import time
from Mongo_cache import MongoCache?
import win32com.client
import winsound
NUM_THREAD = 5
COUNT = 0
lock = threading.Lock()
cache = MongoCache() ? ? #數(shù)據(jù)庫連接初始化
def worker():
"""
func: 從csv文件中讀取數(shù)據(jù),并將數(shù)據(jù)返回
"""
? ? for path in os.listdir(os.getcwd()):
? ? ? ? #print("當(dāng)前工作目錄", path)
? ? ? ? file_name = path.split('.')
? ? ? ? #print(file_name)
? ? ? ? if file_name[-1] == 'csv':
? ? ? ? ? ? #print("地址是:",path)
? ? ? ? ? ? file = open(path)
? ? ? ? ? ? data = csv.reader(file)
? ? ? ? ? ? return data
? ? ? ? else:
? ? ? ? ? ? pass
def save_info(data,i, num_retries=2):
"""
func: 將數(shù)據(jù)保存
"""
? ? global COUNT
? ? global lock
? ? global cache
? ? for _, website in data:
? ? ? ? try:
? ? ? ? ? ? lock.acquire()
? ? ? ? ? ? #print("線程{}》》》{}正在運(yùn)行".format(threading.current_thread().name, i))
? ? ? ? ? ? item = {'website':website}
? ? ? ? ? ? cache(item)
? ? ? ? ? ? COUNT += 1
? ? ? ? except:
? ? ? ? ? ? if num_retries > 0:
? ? ? ? ? ? ? ? save_info(data, i, num_retries-1)
? ? ? ? finally:
? ? ? ? ? ? lock.release()
def main():
"""
啟動(dòng)線程
"""
? ? print("start working")
? ? print("working...")
? ? data = worker()
? ? threads = [] ? #設(shè)置主線程
? ? for i in range(NUM_THREAD):
? ? ? ? t = threading.Thread(target=save_info, args=(data, i))
? ? ? ? threads.append(t)
? ? for i in range(NUM_THREAD):
? ? ? ? threads[i].start()
? ? for i in range(NUM_THREAD):
? ? ? ? threads[i].join()
? ? print("all was done!")
if __name__ == '__main__':
? ? s_time = time.time()
? ? main()
? ? e_time = time.time()
? ? print("總的信息條數(shù):", COUNT)
? ? print("總耗時(shí):", e_time-s_time)
? ? speak = win32com.client.Dispatch('SAPI.SPVOICE')
? ? speak.Speak("早上好,eric,程序結(jié)束!")

數(shù)據(jù)存儲(chǔ)模塊

import pickle
import zlib
from bson.binary import Binary?
from datetime import datetime, timedelta
from pymongo import MongoClient
import time
class MongoCache(object):
? ? def __init__(self, client=None, expires=timedelta(days=30)):
? ? ? ? self.client = MongoClient('localhost', 27017) if client is None else client
? ? ? ? self.db = self.client.cache
? ? ? ? #self.db.webpage.create_index('timestamp', expireAfterSeconds=expires.total_seconds()) ?#設(shè)置自動(dòng)刪除時(shí)間
? ? def __call__(self,url):
? ? ? ? self.db.webpage.insert(url)
? ? ? ? #print("保存成功")
? ? def __contains__(self,url):
? ? ? ? try:
? ? ? ? ? ? self[url]
? ? ? ? except KeyError:
? ? ? ? ? ? return False
? ? ? ? else:
? ? ? ? ? ? return True
? ? def __getitem__(self, url):
? ? ? ? record = self.db.webpage.find_one({'_id':url})
? ? ? ? if record:
? ? ? ? ? ? return pickle.loads(zlib.decompress(record['result']))
? ? ? ? else:
? ? ? ? ? ? raise KeyError(url + 'dose not exist')
? ? def __setitem__(self, url, result):
? ? ? ? record = {'result': Binary(zlib.compress(pickle.dumps(result))), 'timestamp':datetime.utcnow()}
? ? ? ? self.db.webpage.update({'_id':url},{'$set':record},upsert=True)
? ? def clear(self):
? ? ? ? self.db.webpage.drop()

將一百萬條網(wǎng)址從csv文件保存到數(shù)據(jù)庫所花費(fèi)的時(shí)間為

start working
working...
all was done!
總的信息條數(shù): 1000000
總耗時(shí): 427.4034459590912

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 總結(jié)用Pdb庫調(diào)試Python的方式及常用的命令

    總結(jié)用Pdb庫調(diào)試Python的方式及常用的命令

    大家都知道Python是自帶Pdb庫,使用Pdb調(diào)試Python程序還是很方便的。但是遠(yuǎn)程調(diào)試、多線程,Pdb是搞不定的,下面一起來看看用Pdb庫調(diào)試Python的方式及常用的命令。
    2016-08-08
  • python基礎(chǔ)之變量和數(shù)據(jù)類型

    python基礎(chǔ)之變量和數(shù)據(jù)類型

    這篇文章主要介紹了python的變量和數(shù)據(jù)類型,實(shí)例分析了Python中返回一個(gè)返回值與多個(gè)返回值的方法,需要的朋友可以參考下
    2021-10-10
  • python爬蟲之利用selenium+opencv識(shí)別滑動(dòng)驗(yàn)證并模擬登陸知乎功能

    python爬蟲之利用selenium+opencv識(shí)別滑動(dòng)驗(yàn)證并模擬登陸知乎功能

    本文給大家介紹python爬蟲之利用selenium+opencv識(shí)別滑動(dòng)驗(yàn)證并模擬登陸知乎功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-09-09
  • 一文詳解Python中的時(shí)間和日期處理

    一文詳解Python中的時(shí)間和日期處理

    在Python開發(fā)中,我們經(jīng)常需要處理日期和時(shí)間,Python提供了一些內(nèi)置模塊,如datetime、time和calendar,這些模塊讓我們能夠輕松地獲取、操作和格式化日期和時(shí)間,本文將介紹如何在Python中使用這些模塊進(jìn)行日期和時(shí)間的處理
    2023-06-06
  • Anaconda虛擬環(huán)境實(shí)操指南(告別Python多版本環(huán)境沖突!)

    Anaconda虛擬環(huán)境實(shí)操指南(告別Python多版本環(huán)境沖突!)

    Anaconda是一個(gè)用于學(xué)習(xí)和開發(fā)Python編程語言的軟件包一個(gè)由Python編寫的集成開發(fā)環(huán)境,下面這篇文章主要介紹了Anaconda虛擬環(huán)境實(shí)操的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2026-05-05
  • Python 序列化和反序列化庫 MarshMallow 的用法實(shí)例代碼

    Python 序列化和反序列化庫 MarshMallow 的用法實(shí)例代碼

    marshmallow(Object serialization and deserialization, lightweight and fluffy.)用于對(duì)對(duì)象進(jìn)行序列化和反序列化,并同步進(jìn)行數(shù)據(jù)驗(yàn)證。這篇文章主要介紹了Python 序列化和反序列化庫 MarshMallow 的用法實(shí)例代碼,需要的朋友可以參考下
    2020-02-02
  • python如何按照自己順序讀出文件名

    python如何按照自己順序讀出文件名

    這篇文章主要介紹了python如何按照自己順序讀出文件名問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • python中文本字符處理的簡(jiǎn)單方法記錄

    python中文本字符處理的簡(jiǎn)單方法記錄

    這篇文章主要給大家介紹了關(guān)于python中文本字符處理的簡(jiǎn)單方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Keras搭建孿生神經(jīng)網(wǎng)絡(luò)Siamese?network比較圖片相似性

    Keras搭建孿生神經(jīng)網(wǎng)絡(luò)Siamese?network比較圖片相似性

    這篇文章主要為大家介紹了Keras搭建孿生神經(jīng)網(wǎng)絡(luò)Siamese?network比較圖片相似性,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • python?pandas創(chuàng)建多層索引MultiIndex的6種方式

    python?pandas創(chuàng)建多層索引MultiIndex的6種方式

    這篇文章主要為大家介紹了python?pandas創(chuàng)建多層索引MultiIndex的6種方式,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07

最新評(píng)論

屏南县| 英吉沙县| 涟水县| 延川县| 杂多县| 迁西县| 甘孜| 夏河县| 固阳县| 泽普县| 蒲江县| 邵阳县| 古田县| 乳源| 嘉峪关市| 济源市| 洪洞县| 延川县| 磐安县| 大连市| 甘孜县| 宁武县| 澄迈县| 庐江县| 平昌县| 即墨市| 曲周县| 吉水县| 鄂托克旗| 沐川县| 综艺| 临湘市| 毕节市| 翼城县| 丹阳市| 镇远县| 西盟| 丰县| 金平| 双城市| 宁远县|