У меня есть этот код, цель которого - дедупликация запросов.
def dedup_requests(f):
pending = {}
@functools.wraps(f)
def wrapped(*args, **kwargs):
key = _make_call_key(args, kwargs)
if key not in pending:
pending[key] = gevent.spawn(f, *args, **kwargs)
result = pending[key].get()
if key in pending:
del pending[key]
return result
return wrapped
Я подозреваю, что это как-то вызывает тупик (это случается один раз, и я не могу его воспроизвести).
Это происходит как при использовании многопоточности, так и при использовании gevent.
Разрешено ли повторное использование get
?
Может ли этот код даже вызвать взаимоблокировку, когда многопоточность не задействована?
Обратите внимание, что он работает под другими задачами gevent, поэтому порожденные задачи могут порождать дополнительные задачи, в случае, если это проблема.