from typing import Callable, Awaitable, Any
import asyncio
import logging
def create_strict_periodic_task(func: Callable, period: int, revokable=False) -> asyncio.Task: # todo: check revoke
async def inner(f: Callable) -> None:
while True:
try:
if asyncio.iscoroutinefunction(f):
await f()
else:
f()
await asyncio.sleep(period)
except Exception as exc:
if revokable:
logging.exception(f'Error while performing periodic task with {f.__name__} - {exc}')
await asyncio.sleep(5)
else:
raise exc
return asyncio.create_task(inner(func))
def create_adaptive_periodic_task(func: Callable[..., Awaitable[Any]], period: int, revokable=False) -> asyncio.Task:
async def inner(f: Callable) -> None:
while True:
try:
asyncio.create_task(f())
await asyncio.sleep(period)
except Exception as exc:
if revokable:
logging.exception(f'Error while performing periodic task with {f.__name__} - {exc}')
await asyncio.sleep(5)
else:
raise exc
return asyncio.create_task(inner(func))
ZnJvbSB0eXBpbmcgaW1wb3J0IENhbGxhYmxlLCBBd2FpdGFibGUsIEFueQppbXBvcnQgYXN5bmNpbwppbXBvcnQgbG9nZ2luZwoKCmRlZiBjcmVhdGVfc3RyaWN0X3BlcmlvZGljX3Rhc2soZnVuYzogQ2FsbGFibGUsIHBlcmlvZDogaW50LCByZXZva2FibGU9RmFsc2UpIC0+IGFzeW5jaW8uVGFzazogICMgdG9kbzogY2hlY2sgcmV2b2tlCiAgICBhc3luYyBkZWYgaW5uZXIoZjogQ2FsbGFibGUpIC0+IE5vbmU6CiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaWYgYXN5bmNpby5pc2Nvcm91dGluZWZ1bmN0aW9uKGYpOgogICAgICAgICAgICAgICAgICAgIGF3YWl0IGYoKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBmKCkKICAgICAgICAgICAgICAgIGF3YWl0IGFzeW5jaW8uc2xlZXAocGVyaW9kKQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4YzoKICAgICAgICAgICAgICAgIGlmIHJldm9rYWJsZToKICAgICAgICAgICAgICAgICAgICBsb2dnaW5nLmV4Y2VwdGlvbihmJ0Vycm9yIHdoaWxlIHBlcmZvcm1pbmcgcGVyaW9kaWMgdGFzayB3aXRoIHtmLl9fbmFtZV9ffSAtIHtleGN9JykKICAgICAgICAgICAgICAgICAgICBhd2FpdCBhc3luY2lvLnNsZWVwKDUpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIGV4YwoKICAgIHJldHVybiBhc3luY2lvLmNyZWF0ZV90YXNrKGlubmVyKGZ1bmMpKQoKCmRlZiBjcmVhdGVfYWRhcHRpdmVfcGVyaW9kaWNfdGFzayhmdW5jOiBDYWxsYWJsZVsuLi4sIEF3YWl0YWJsZVtBbnldXSwgcGVyaW9kOiBpbnQsIHJldm9rYWJsZT1GYWxzZSkgLT4gYXN5bmNpby5UYXNrOgogICAgYXN5bmMgZGVmIGlubmVyKGY6IENhbGxhYmxlKSAtPiBOb25lOgogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGFzeW5jaW8uY3JlYXRlX3Rhc2soZigpKQogICAgICAgICAgICAgICAgYXdhaXQgYXN5bmNpby5zbGVlcChwZXJpb2QpCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXhjOgogICAgICAgICAgICAgICAgaWYgcmV2b2thYmxlOgogICAgICAgICAgICAgICAgICAgIGxvZ2dpbmcuZXhjZXB0aW9uKGYnRXJyb3Igd2hpbGUgcGVyZm9ybWluZyBwZXJpb2RpYyB0YXNrIHdpdGgge2YuX19uYW1lX199IC0ge2V4Y30nKQogICAgICAgICAgICAgICAgICAgIGF3YWl0IGFzeW5jaW8uc2xlZXAoNSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgZXhjCgogICAgcmV0dXJuIGFzeW5jaW8uY3JlYXRlX3Rhc2soaW5uZXIoZnVuYykp