Почему цикл событий не используется в потоке? - PullRequest
0 голосов
/ 01 ноября 2019

Я написал класс, как показано ниже. Цель этого класса - сделать асинхронный вызов простым и многопроцессорным.

class AsyncPool(object):

    loop = asyncio.new_event_loop()
    asyncio.set_event_loop(loop)

    def __init__(self, pool_size=1000):

        self.task_list = list()
        self.running_task = list()
        self.pool_size = pool_size
        self.current_pool_size = 0

    def add_task(self, func, *args, **kwargs):
        self.task_list.append({
            'call': func,
            'kwargs': kwargs,
            'args': args
        })

    def run(self):
        for item in self.task_list:
            if self.current_pool_size < self.pool_size:

                self.current_pool_size += 1
                func = item.get('call')
                args = item.get('args')
                kwargs = item.get('kwargs')

                self.running_task.append(
                    asyncio.ensure_future(
                        func(*args, **kwargs)
                    )
                )
            else:                    self.loop.run_until_complete(asyncio.wait(self.running_task))
                self.current_pool_size = 0

Пример использования будет таким, как показано ниже

pool = AsyncPool(pool_size=10)

for num in range(1, 101):
    pool.add_task(hello_world, num)

pool.run()

Здесь hello_world может быть любой функцией, определенной async,Например:

async def hello(id, *args, **kwargs):
    await asyncio.sleep(5)

Это хорошо работает в скрипте. Но когда я называю это в представлении Джанго. Он сообщает об ошибке, как показано ниже:

RuntimeError: There is no current event loop in thread 'Thread-13'.

Я предполагаю, что django реализует каждый запрос в отдельном потоке. Достаточно инициализировать атрибут цикла в классе и сделать его атрибутом класса. Но объект цикла не может быть разделен между потоками. Но я не знаю, правильно ли это.

Так могли бы вы дать какое-нибудь предложение по этому поводу?

Почему возникает эта ошибка?
Как мне изменить класс AsyncPool, чтобы он работал в django

...