Skip to content

Latest commit

 

History

History
36 lines (27 loc) · 1.22 KB

README.md

File metadata and controls

36 lines (27 loc) · 1.22 KB

django_threaded_sync_to_async

Tools for replacing sync_to_async calls to sync_to_async(thread_sensitive=False, executor=...), effectively allowing Django to make calls to database concurrently.

pip3 install django_threaded_sync_to_async

Executor

import django_threaded_sync_to_async

async with django_threaded_sync_to_async.Executor(thread_name_prefix="thread", max_workers=3) as executor:
    a = asgiref.sync.sync_to_async(long_call)(1)
    b = asgiref.sync.sync_to_async(long_call)(2)
    c = asgiref.sync.sync_to_async(long_call)(3)
    d = asgiref.sync.sync_to_async(long_call)(4)
    await asyncio.gather(a, b, c, d)

SharedExecutor

Maintains global dictionary of executors (concurrent.futures.ThreadPoolExecutor) accessed by name and allows to limit utilization of executor for a single context.

import django_threaded_sync_to_async

@django_threaded_sync_to_async.SharedExecutor("common", max_workers=3, max_tasks=2)
async def operations():
    a = asgiref.sync.sync_to_async(long_call)(1)
    b = asgiref.sync.sync_to_async(long_call)(2)
    c = asgiref.sync.sync_to_async(long_call)(3)
    d = asgiref.sync.sync_to_async(long_call)(4)
    await asyncio.gather(a, b, c, d)