Асинхронная обработка нескольких файлов в массиве - Python - PullRequest
0 голосов
/ 14 января 2019

У меня есть массив, который заполняется файлами каждые 5 секунд, например:

my_files = [file1, file2.., filen]

Каждый из этих файлов должен пройти через функции для некоторой обработки. Например:

def func1:
    do something 
    return result1

def func2(result1):
    do something else 

И так далее. Файлы не связаны друг с другом, однако выходные данные функций (например, результат одной функции необходим для второй и т. Д.)

В данный момент мой скрипт обрабатывает каждый из файлов одновременно, и поэтому он может быть довольно медленным. Есть ли способ, чтобы мой скрипт обрабатывал файлы по мере их поступления? Я довольно новичок в программировании, и я не могу понять, как работает асинхронное / параллельное программирование. Я уже посмотрел в asyncio.

1 Ответ

0 голосов
/ 14 января 2019

Вообще говоря, это зависит от того, как работает ваша обработка. в Python настоящая многопроцессорная обработка выполняется с помощью многопроцессорной библиотеки. С другой стороны, потоки выполняются с помощью библиотеки потоков. Библиотека потоков больше похожа на асинхронную обработку. Это не будет ускорять ваш код, но будет быстрее, если ваш код будет замедлен из-за ожидания.

это то, что вы можете сделать:

import threading
def all_in_one_function(some_file):
  result = process_file(some_file)
  if result == 'result1':
     do this
  if result == 'result2':
     do that


while True:
    if len(my_files) >0:
        file_to_be_processed = my_files.pop()
        threading.Thread(target = all_in_one_function,args=(file_to_be_processed,)).start()
# you pop the files from your array and process it asyncronously, everytime a file appears it will be popped out of array and processed 

Что касается потоков, я советую вам использовать одну функцию. Это означает, что есть функция, которая будет просто выполнять всю обработку. Или создайте класс, который будет выполнять обработку (передает аргументы между функциями) и обрабатывать инициализированный объект.

Я предпочитаю создавать одну функцию со всей обработкой. Вы не хотите углубляться в передачу аргументов между потоками ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...