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