Эффективный Python эквивалент этого простого класса обещания JavaScript - PullRequest
0 голосов
/ 26 февраля 2020

Вот код JavaScript:

class TaskQueue {
  constructor() {
    this._chain = Promise.resolve();
  }
  postTask(task) {
    const result = this._chain.then(task);
    this._chain = result.catch(() => {});
    return result;
  }
}

Я уверен, что это просто берет задачу (функцию), получает из нее Promise, игнорирует ошибки и добавляет его в класс «цепь». Хотя я не совсем уверен, почему именно. Вот файл , о котором идет речь, а здесь - это место, где вы можете найти его используемым. При использовании мне кажется, что мне не нужна система очередей.

Я понятия не имею, что делать в Python. Я знаю, что не существует «точного» эквивалента этому стилю кода Python, но я хотел бы эффективно его воспроизвести или, по крайней мере, добиться тех же результатов, что и JS, даже если другим методом.

1 Ответ

1 голос
/ 26 февраля 2020

then создает новое обещание, которое запускается после разрешения старого. В Python вы можете создать задачу, сопрограмма которой ожидает предыдущую. Что-то вроде:

class TaskQueue:
    def __init__(self):
        fut = asyncio.get_event_loop().create_future()
        fut.set_result(None)
        self._task = fut

    def post_task(self, awaitable):
        async def run_awaitable(prev):
            try:
                await prev
                await awaitable
            except:
                pass  # consider at least logging here
        self._task = asyncio.create_task(run_awaitable(self._task))
...