J'ai été occupé à écrire mon premier code de multiprocessing et il fonctionne, yay. Cependant, j'aimerais maintenant avoir un retour sur la progression et je ne suis pas sûr de la meilleure approche à adopter.
Ce que mon code (voir ci-dessous) fait en bref :
- Un répertoire cible est analysé à la recherche de fichiers mp4.
- Chaque fichier est analysé par un processus distinct, le processus enregistre un résultat (une image).
Ce que je cherche pourrait être :
- Simple
- Chaque fois qu'un processus termine un fichier, il envoie un message "terminé".
- Le code principal compte le nombre de fichiers terminés.
-
Fantaisie
Core 0 processing file 20 of 317 ||||||_ 60% completed Core 1 processing file 21 of 317 ||||||||| 90% completed ... Core 7 processing file 18 of 317 ||__ 20% completed
J'ai lu toutes sortes d'informations sur les files d'attente, les pools, le tqdm et je ne suis pas sûr de la voie à suivre. Quelqu'un pourrait-il m'indiquer une approche qui fonctionnerait dans ce cas ?
Merci d'avance !
EDIT : J'ai modifié mon code qui lance les processus comme suggéré par gsb22.
Mon code :
# file operations
import os
import glob
# Multiprocessing
from multiprocessing import Process
# Motion detection
import cv2
# >>> Enter directory to scan as target directory
targetDirectory = "E:\Projects\Programming\Python\OpenCV\\videofiles"
def get_videofiles(target_directory):
# Find all video files in directory and subdirectories and put them in a list
videofiles = glob.glob(target_directory + '/**/*.mp4', recursive=True)
# Return the list
return videofiles
def process_file(videofile):
'''
What happens inside this function:
- The video is processed and analysed using openCV
- The result (an image) is saved to the results folder
- Once this function receives the videofile it completes
without the need to return anything to the main program
'''
# The processing code is more complex than this code below, this is just a test
cap = cv2.VideoCapture(videofile)
for i in range(10):
succes, frame = cap.read()
# cv2.imwrite('{}/_Results/{}_result{}.jpg'.format(targetDirectory, os.path.basename(videofile), i), frame)
if succes:
try:
cv2.imwrite('{}/_Results/{}_result_{}.jpg'.format(targetDirectory, os.path.basename(videofile), i), frame)
except:
print('something went wrong')
if __name__ == "__main__":
# Create directory to save results if it doesn't exist
if not os.path.exists(targetDirectory + '/_Results'):
os.makedirs(targetDirectory + '/_Results')
# Get a list of all video files in the target directory
all_files = get_videofiles(targetDirectory)
print(f'{len(all_files)} video files found')
# Create list of jobs (processes)
jobs = []
# Create and start processes
for file in all_files:
proc = Process(target=process_file, args=(file,))
jobs.append(proc)
for job in jobs:
job.start()
for job in jobs:
job.join()
# TODO: Print some form of progress feedback
print('Finished :)')