EOFError: закончилась ошибка ввода при многопроцессорной обработке в PythonPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 EOFError: закончилась ошибка ввода при многопроцессорной обработке в Python

Сообщение Anonymous »

Я пытаюсь написать менеджер загрузок с библиотекой Gallery_dl на Python, но у меня проблема с многопроцессорностью (для управления несколькими задачами загрузки в интерфейсе веб-интерфейса).
Когда я пытаюсь создать новое задание в методе __init__ класса DownloadTask, я получаю сообщение self = Reduction.pickle.load(from_parent) ... EOFError: Ошибка ввода.
Я предполагаю, что это связано с тем, что многопроцессорная обработка использует Pickle для сериализации данных в дочерних процессах, и Pickle не может обработать экземпляр галереи_dl, но я понятия не имею, что с этим делать.
Есть ли способ исправить или обойти это?
Вот упрощенная версия моего кода:

Код: Выделить всё

# DownloadManager.py
from typing import Dict
from DownloadTask import DownloadTask
import uuid
import multiprocessing

class DownloadManager:
def __init__(self):
self.tasks: Dict[str, DownloadTask] = {}
self.processes: Dict[str, multiprocessing.Process] = {}

def add_task(self, url: str) -> str:
task_id = str(uuid.uuid4())
new_task = DownloadTask(task_id, url)
self.tasks[task_id] = new_task

task_process = multiprocessing.Process(target=new_task.start)
self.processes[task_id] = task_process
task_process.start()

return task_id

if __name__ == '__main__':
downloader = DownloadManager()
downloader.add_task("https://lexica.art/?q=cats")

Код: Выделить всё

# DownloadTask.py
from gallery_dl import job

class DownloadTask:
def __init__(self, task_id: str, url: str):
self.task_id = task_id
self.url = url
self.job = job.DownloadJob(url)

def start(self):
self._download()

def _download(self):
self.job.run()
Я попытался инициализировать задание как None и создать его в методе start класса DownloadTask. Но таким образом я не могу получить доступ к заданию позже другими методами (которые мне нужны в методах паузы/возобновления)

Код: Выделить всё

# Modified DownloadTask.py
from gallery_dl import job

class DownloadTask:
def __init__(self, task_id: str, url: str):
self.task_id = task_id
self.url = url
self.job = None  # init as None

def start(self):
self.job = job.DownloadJob(self.url) # create the job instance
self._download()

def _download(self):
self.job.run()

def pause(self):
print(self.job) # this will print None
# actual pausing code
Обратите внимание, что метод паузы в DownloadTask является обязательным, поскольку у меня есть расширенный класс для DownloadJob галереи_dl< /code> класс для приостановки и других модификаций. Мне нужно получить доступ к self.job из метода puause здесь (если это возможно).


Подробнее здесь: https://stackoverflow.com/questions/790 ... -in-python
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»