{"title":"Tacaíocht asincrónach","version":"5.2","locale":"ga","docname":"topics/async","url":"/ga/5.2/topics/async/","canonical":"https://djangodocs.dev/ga/5.2/topics/async/","summary":"Tá tacaíocht ag Django chun tuairimí asincrónacha (“async”) a scríobh, mar aon le cruach iarratais atá cumasaithe go hiomlán asinc-chumasaithe má tá tú ag…","html":"<h1>Tacaíocht asincrónach<a class=\"heading-anchor\" href=\"#asynchronous-support\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Tá tacaíocht ag Django chun tuairimí asincrónacha (“async”) a scríobh, mar aon le cruach iarratais atá cumasaithe go hiomlán asinc-chumasaithe má tá tú ag rith fao:doc: ASGI &lt;/howto/deployment/asgi/index&gt;. Oibreoidh tuairimí async fós faoi WSGI, ach le pionóis feidhmíochta, agus gan an cumas iarratais éifeachtacha fadtéarmach a bheith acu.</p>\n<p>Táimid fós ag obair ar thacaíocht async don ORM agus do chodanna eile de Django. Is féidir leat a bheith ag súil leis seo a fheiceáil in eisiúintí amach anseo. Go dtí seo, is féidir leat an cuibheoir: func: sync_to_async a úsáid chun idirghníomhú le codanna sioncrónaithe de Django. Tá raon iomlán leabharlanna Python asinc-dúchasacha ann freisin ar féidir leat comhtháthú leo.</p>\n<section id=\"async-views\">\n<h2>Tuairimí async<a class=\"heading-anchor\" href=\"#async-views\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Is féidir aon radharc a dhearbhú async tríd an gcuid inghlaonta de coroutine a thabhairt ar ais - go coitianta, déantar é seo ag baint úsáide as <code class=\"docutils literal notranslate\">async def</code>. Maidir le dearcadh bunaithe ar fheidhm, ciallaíonn sé seo an dearcadh iomlán a dhearbhú ag baint úsáide as <code class=\"docutils literal notranslate\">async def</code>. Maidir le dearcadh rang-bhunaithe, ciallaíonn sé seo láimhseálaithe modh HTTP a dhearbhú, mar shampla <code class=\"docutils literal notranslate\">get () ``agus ``post ()</code> mar async def` (ní a <code class=\"docutils literal notranslate\">__init__ () ``, nó ``as_view ()</code>).</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>Úsáideann Django <code class=\"docutils literal notranslate\">asgiref.sync.iscoroutinefunction</code> chun tástáil a dhéanamh an bhfuil do thuairim asincrónach nó nach bhfuil. Má chuireann tú do mhodh féin chun coroutine a thabhairt ar ais, déan cinnte go n-úsáideann tú <code class=\"docutils literal notranslate\">asgiref.sync.markcoroutinefunction` ionas go bhfillfidh an fheidhm seo ``True</code>.</p>\n</aside>\n<p>Faoi fhreastalaí WSGI, reáchtálfaidh tuairimí async ina lúb imeachta aonuaire féin. Ciallaíonn sé seo gur féidir leat gnéithe async a úsáid, cosúil le hiarratais HTTP async comhthráthacha, gan aon cheisteanna, ach ní gheobhaidh tú na buntáistí a bhaineann le cruach async.</p>\n<p>Is iad na príomhbhuntáistí an cumas na céadta naisc a sheirbheáil gan snáitheanna Python a úsáid. Ligeann sé seo duit sruthú mall, vótaíocht fhada, agus cineálacha freagartha spreagúla eile a úsáid.</p>\n<p>Más mian leat iad seo a úsáid, beidh ort Django a úsáid ag baint úsáidea:doc: ASGI ina ionad &lt;/howto/deployment/asgi/index&gt;.</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Warning</p>\n<p>Ní bhfaighidh tú na buntáistí a bhaineann le cruach iarratais lán-asincrónach mura bhfuil * aon mheánghearraí sioncrónach agat* luchtaithe isteach i do shuíomh. Má tá píosa de mheán-earraí sioncrónach ann, ansin caithfidh Django snáithe in aghaidh an iarratais a úsáid chun aithris a dhéanamh ar thimpeallacht sioncrónach dó go sábháilte.</p>\n<p>&lt;async-middleware&gt;Is féidir Middleware a thógáil chun tacú le comhthéacsanna: ref: sync agus async araon. Tógtar cuid de mheán-earraí Django mar seo, ach ní gach ceann. Chun a fheiceáil cad iad na middleware caithfidh Django oiriúnú dó, is féidir leat logáil dífhabhtaithe a chasadh air don logálaí <code class=\"docutils literal notranslate\">django.request</code> agus teachtaireachtaí logála a lorg fao*&quot;Láimhseálaí asincrónach oiriúnaithe le haghaidh middleware... “<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">*</span></a>.</p>\n</aside>\n<p>I mód ASGI agus WSGI araon, is féidir leat tacaíocht asincrónach a úsáid go sábháilte fós chun cód a reáchtáil ag an am céanna seachas go sraitheach. Tá sé seo áisiúil go háirithe agus tú ag déileáil le APIs seachtracha nó stórais sonraí.</p>\n<p>Más mian leat glaoch ar chuid de Django atá fós sioncrónach, beidh ort é a fhilleadh i nglao a:func: sync_to_async. Mar shampla:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">asgiref.sync</span> <span class=\"kn\">import</span> sync_to_async\n\nresults <span class=\"o\">=</span> <span class=\"k\">await</span> sync_to_async<span class=\"p\">(</span>sync_function<span class=\"p\">,</span> thread_sensitive<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)(</span>pk<span class=\"o\">=</span><span class=\"mi\">123</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>&lt;async-safety&gt;Má dhéanann tú iarracht de thaisme glaoch ar chuid de Django atá sioncrónach amháin ó radharc async, spreagfaidh tú Django's:ref: <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>cosaint sábháilteachta asincrónach <a href=\"#id3\"><span class=\"problematic\" id=\"id4\">`</span></a>chun do chuid sonraí a chosaint ar éilliú.</p>\n<section id=\"decorators\">\n<h3>Maisitheoirí<a class=\"heading-anchor\" href=\"#decorators\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Is féidir na maisitheoirí seo a leanas a úsáid le feidhmeanna amharc sioncrónach agus asincrónach araon:</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/ga/5.2/topics/http/decorators/#django.views.decorators.cache.cache_control\" title=\"django.views.decorators.cache.cache_control\"><code class=\"xref py py-func docutils literal notranslate\">cache_control()</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ga/5.2/topics/http/decorators/#django.views.decorators.cache.never_cache\" title=\"django.views.decorators.cache.never_cache\"><code class=\"xref py py-func docutils literal notranslate\">never_cache()</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ga/5.2/topics/http/decorators/#django.views.decorators.common.no_append_slash\" title=\"django.views.decorators.common.no_append_slash\"><code class=\"xref py py-func docutils literal notranslate\">no_append_slash()</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ga/5.2/ref/csrf/#django.views.decorators.csrf.csrf_exempt\" title=\"django.views.decorators.csrf.csrf_exempt\"><code class=\"xref py py-func docutils literal notranslate\">csrf_exempt()</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ga/5.2/ref/csrf/#django.views.decorators.csrf.csrf_protect\" title=\"django.views.decorators.csrf.csrf_protect\"><code class=\"xref py py-func docutils literal notranslate\">csrf_protect()</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ga/5.2/ref/csrf/#django.views.decorators.csrf.ensure_csrf_cookie\" title=\"django.views.decorators.csrf.ensure_csrf_cookie\"><code class=\"xref py py-func docutils literal notranslate\">ensure_csrf_cookie()</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ga/5.2/ref/csrf/#django.views.decorators.csrf.requires_csrf_token\" title=\"django.views.decorators.csrf.requires_csrf_token\"><code class=\"xref py py-func docutils literal notranslate\">requires_csrf_token()</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ga/5.2/howto/error-reporting/#django.views.decorators.debug.sensitive_variables\" title=\"django.views.decorators.debug.sensitive_variables\"><code class=\"xref py py-func docutils literal notranslate\">sensitive_variables()</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ga/5.2/howto/error-reporting/#django.views.decorators.debug.sensitive_post_parameters\" title=\"django.views.decorators.debug.sensitive_post_parameters\"><code class=\"xref py py-func docutils literal notranslate\">sensitive_post_parameters()</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ga/5.2/topics/http/decorators/#django.views.decorators.gzip.gzip_page\" title=\"django.views.decorators.gzip.gzip_page\"><code class=\"xref py py-func docutils literal notranslate\">gzip_page()</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ga/5.2/topics/http/decorators/#django.views.decorators.http.condition\" title=\"django.views.decorators.http.condition\"><code class=\"xref py py-func docutils literal notranslate\">condition()</code></a></p></li>\n<li><p><a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>leathanach_coinníollacha () ``</p></li>\n<li><p><a class=\"reference internal\" href=\"/ga/5.2/topics/http/decorators/#django.views.decorators.http.etag\" title=\"django.views.decorators.http.etag\"><code class=\"xref py py-func docutils literal notranslate\">etag()</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ga/5.2/topics/http/decorators/#django.views.decorators.http.last_modified\" title=\"django.views.decorators.http.last_modified\"><code class=\"xref py py-func docutils literal notranslate\">last_modified()</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ga/5.2/topics/http/decorators/#django.views.decorators.http.require_http_methods\" title=\"django.views.decorators.http.require_http_methods\"><code class=\"xref py py-func docutils literal notranslate\">require_http_methods()</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ga/5.2/topics/http/decorators/#django.views.decorators.http.require_GET\" title=\"django.views.decorators.http.require_GET\"><code class=\"xref py py-func docutils literal notranslate\">require_GET()</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ga/5.2/topics/http/decorators/#django.views.decorators.http.require_POST\" title=\"django.views.decorators.http.require_POST\"><code class=\"xref py py-func docutils literal notranslate\">require_POST()</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ga/5.2/topics/http/decorators/#django.views.decorators.http.require_safe\" title=\"django.views.decorators.http.require_safe\"><code class=\"xref py py-func docutils literal notranslate\">require_safe()</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ga/5.2/topics/http/decorators/#django.views.decorators.vary.vary_on_cookie\" title=\"django.views.decorators.vary.vary_on_cookie\"><code class=\"xref py py-func docutils literal notranslate\">vary_on_cookie()</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ga/5.2/topics/http/decorators/#django.views.decorators.vary.vary_on_headers\" title=\"django.views.decorators.vary.vary_on_headers\"><code class=\"xref py py-func docutils literal notranslate\">vary_on_headers()</code></a></p></li>\n<li><p><a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>xframe_options_deny () ``</p></li>\n<li><p><a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>xframe_options_sameorigin () ``</p></li>\n<li><p><a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>xframe_options_díolmhaithe () ``</p></li>\n</ul>\n<p>Mar shampla:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.views.decorators.cache</span> <span class=\"kn\">import</span> never_cache\n\n\n<span class=\"nd\">@never_cache</span>\n<span class=\"k\">def</span> <span class=\"nf\">my_sync_view</span><span class=\"p\">(</span>request<span class=\"p\">):</span> <span class=\"o\">...</span>\n\n\n<span class=\"nd\">@never_cache</span>\n<span class=\"k\">async</span> <span class=\"k\">def</span> <span class=\"nf\">my_async_view</span><span class=\"p\">(</span>request<span class=\"p\">):</span> <span class=\"o\">...</span>\n</code></pre></div>\n</section>\n<section id=\"queries-the-orm\">\n<h3>Fiosrúcháin &amp; an ORM<a class=\"heading-anchor\" href=\"#queries-the-orm\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Le roinnt eisceachtaí, is féidir le Django ceisteanna ORM a reáchtáil go hincrónach freisin:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">async</span> <span class=\"k\">for</span> author <span class=\"ow\">in</span> Author<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>name__startswith<span class=\"o\">=</span><span class=\"s2\">&quot;A&quot;</span><span class=\"p\">):</span>\n    book <span class=\"o\">=</span> <span class=\"k\">await</span> author<span class=\"o\">.</span>books<span class=\"o\">.</span>afirst<span class=\"p\">()</span>\n</code></pre></div>\n<p>Is féidir nótaí mionsonraithe a fháil in:ref: async-queries, ach i mbeagán focal:</p>\n<ul class=\"simple\">\n<li><p>Tá leagan asincrónach réamhshocraithe ag gach modh <code class=\"docutils literal notranslate\">QuerySet</code> a fhágann go dtarlóidh ceist SQL.</p></li>\n<li><p>Tacaítear le <code class=\"docutils literal notranslate\">async for</code> ar gach cearrSets (lena n-áirítear aschur <code class=\"docutils literal notranslate\">luachanna () ``agus ``values_list ()</code>.)</p></li>\n</ul>\n<p>Tacaíonn Django freisin le roinnt modhanna samhail asincrónach a úsáideann an bunachar sonraí:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">async</span> <span class=\"k\">def</span> <span class=\"nf\">make_book</span><span class=\"p\">(</span><span class=\"o\">*</span>args<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">):</span>\n    book <span class=\"o\">=</span> Book<span class=\"p\">(</span><span class=\"o\">...</span><span class=\"p\">)</span>\n    <span class=\"k\">await</span> book<span class=\"o\">.</span>asave<span class=\"p\">(</span>using<span class=\"o\">=</span><span class=\"s2\">&quot;secondary&quot;</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">async</span> <span class=\"k\">def</span> <span class=\"nf\">make_book_with_tags</span><span class=\"p\">(</span>tags<span class=\"p\">,</span> <span class=\"o\">*</span>args<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">):</span>\n    book <span class=\"o\">=</span> <span class=\"k\">await</span> Book<span class=\"o\">.</span>objects<span class=\"o\">.</span>acreate<span class=\"p\">(</span><span class=\"o\">...</span><span class=\"p\">)</span>\n    <span class=\"k\">await</span> book<span class=\"o\">.</span>tags<span class=\"o\">.</span>aset<span class=\"p\">(</span>tags<span class=\"p\">)</span>\n</code></pre></div>\n<p>Ní oibríonn idirbhearta fós i mód async. Má tá píosa cód agat a dteastaíonn iompar idirbhearta uaidh, molaimid duit an píosa sin a scríobh mar fheidhm sioncrónach amháin agus glaoch air ag baint úsáid:func: sync_to_async.</p>\n<p><a class=\"reference internal\" href=\"/ga/5.2/ref/databases/#persistent-database-connections\"><span class=\"std std-ref\">Persistent database connections</span></a>, set\nvia the <a class=\"reference internal\" href=\"/ga/5.2/ref/settings/#std-setting-CONN_MAX_AGE\"><code class=\"xref std std-setting docutils literal notranslate\">CONN_MAX_AGE</code></a> setting, should also be disabled in async mode.\nInstead, use your database backend's built-in connection pooling if available,\nor investigate a third-party connection pooling option if required.</p>\n</section>\n<section id=\"performance\">\n<span id=\"async-performance\"></span><h3>feidhmíocht<a class=\"heading-anchor\" href=\"#performance\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Agus tú ag rith i mód nach n-oireann leis an radharc (m.sh. radharc async faoi WSGI, nó radharc sioncrónaithe traidisiúnta faoi ASGI), caithfidh Django aithris a dhéanamh ar an stíl glaonna eile chun ligean do chód rith. Is cúis leis an lasc comhthéacs seo pionós feidhmíochta beag de thart ar milleisoicind.</p>\n<p>Tá sé seo fíor freisin maidir le middleware. Déanfaidh Django iarracht líon na n-lasc comhthéacs idir sioncrónú agus async a íoslaghdú. Má tá freastalaí ASGI agat, ach tá do mheán-earraí agus do thuairimí go léir sioncrónach, athróidh sé ach uair amháin, sula dtéann sé isteach sa chrac middleware.</p>\n<p>Mar sin féin, má chuireann tú meán-earraí sioncrónach idir freastalaí ASGI agus radharc asincrónach, beidh ort aistriú go mód sioncrónaithe don middleware agus ansin ar ais go mód async don radharc. Coinneoidh Django an snáithe sioncrónaithe ar oscailt freisin le haghaidh iomadú eisceachta middleware. B'fhéidir nach mbeidh sé seo faoi deara ar dtús, ach is féidir an pionós seo de snáithe amháin in aghaidh an iarratais a chur leis is féidir aon buntáiste feidhmíochta async a bhaint.</p>\n<p>Ba chóir duit do thástáil feidhmíochta féin a dhéanamh chun a fháil amach cén éifeacht atá ag ASGI i gcoinne WSGI ar do chód. I roinnt cásanna, d'fhéadfadh go mbeadh méadú feidhmíochta ann fiú le haghaidh bunachar cóid sioncrónach amháin faoi ASGI toisc go bhfuil an cód láimhseála iarratais fós ag rith go gascrónach. Go ginearálta ní bheidh tú ag iarraidh modh ASGI a chumasú ach má tá cód asincrónach agat i do thionscadal.</p>\n</section>\n<section id=\"handling-disconnects\">\n<span id=\"async-handling-disconnect\"></span><h3>Dícheangail láimhseáil<a class=\"heading-anchor\" href=\"#handling-disconnects\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Maidir le hiarratais fadré, féadfaidh cliant a dhícheangal sula dtugann an radharc freagra ar ais. Sa chás seo, ardófar <code class=\"docutils literal notranslate\">Asyncio.CancelleDerror</code> sa radharc. Is féidir leat an earráid seo a ghabháil agus é a láimhseáil más gá duit aon ghlanadh a dhéanamh:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">async</span> <span class=\"k\">def</span> <span class=\"nf\">my_view</span><span class=\"p\">(</span>request<span class=\"p\">):</span>\n    <span class=\"k\">try</span><span class=\"p\">:</span>\n        <span class=\"c1\"># Do some work</span>\n        <span class=\"o\">...</span>\n    <span class=\"k\">except</span> asyncio<span class=\"o\">.</span>CancelledError<span class=\"p\">:</span>\n        <span class=\"c1\"># Handle disconnect</span>\n        <span class=\"k\">raise</span>\n</code></pre></div>\n<p>&lt;request-response-streaming-disconnect&gt;Is féidir leat freis:ref: <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>dícheangail cliant a láimhseáil i bhfreagraí sruthú <a href=\"#id3\"><span class=\"problematic\" id=\"id4\">`</span></a>.</p>\n</section>\n</section>\n<section id=\"async-safety\">\n<span id=\"id1\"></span><h2>Sábháilteacht async<a class=\"heading-anchor\" href=\"#async-safety\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"std envvar\">\n<dt class=\"sig sig-object std\" id=\"envvar-DJANGO_ALLOW_ASYNC_UNSAFE\">\n<span class=\"sig-name descname\">DJANGO_ALLOW_ASYNC_UNSAFE</span><a class=\"heading-anchor\" href=\"#envvar-DJANGO_ALLOW_ASYNC_UNSAFE\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Níl príomhchodanna áirithe de Django in ann oibriú go sábháilte i dtimpeallacht async, toisc go bhfuil stát domhanda acu nach bhfuil ar an eolas faoi choirútín. Déantar na codanna seo de Django a aicmiú mar “async-neamhshábháilte”, agus tá siad cosanta ó fhorghníomhú i dtimpeallacht async. Is é an ORM an príomhshampla, ach tá codanna eile ann a chosnaítear ar an mbealach seo freisin.</p>\n<p>Má dhéanann tú iarracht aon cheann de na codanna seo a reáchtáil ó snáithe ina bhfuil lúb imeachta reath* ann, gheobhaidh tú:: exc: ~Django.Core.Exceptions.SynchronousOnlyOperation earráid. Tabhair faoi deara nach gá duit a bheith taobh istigh de fheidhm async go díreach chun an earráid seo a tharlóidh. Má ghlaoigh tú feidhm sioncrónaithe go díreach ó fheidhm async, gan úsáid: func: sync_to_async nó den chineál céanna, ansin is féidir leis tarlú freisin. Tá sé seo toisc go bhfuil do chód fós ag rith i snáithe le lúb imeachta gníomhach, cé nach bhféadfar é a dhearbhú mar chód async.</p>\n<p>Má thagann tú ar an earráid seo, ba cheart duit do chód a shocrú chun gan an cód ciontach a ghlaoch ó chomhthéacs async. Ina áit sin, scríobh do chód a labhraíonn le feidhmeanna async-neamhshábháilte ina fheidhm sioncrónaithe féin, agus glaoigh air sin ag baint úsáid:func: asgiref.sync.sync_to_async (nó aon bhealach eile chun cód sioncrónaithe a reáchtáil ina snáithe féin).</p>\n<p>Is féidir leis an timpeallacht ina bhfuil do chód Django á reáchtáil agat an comhthéacs async a fhorchur ort. Mar shampla, soláthraíonn leabhair nótaí <a class=\"reference external\" href=\"https://jupyter.org/\">Jupyter</a> agus sliogáin idirghníomhacha <a class=\"reference external\" href=\"https://ipython.org\">iPython</a> lúb imeachta gníomhach go trédhearcach ionas go mbeidh sé níos éasca idirghníomhú le APIs asincrónacha.</p>\n<p>Má tá blaosc IPython á úsáid agat, is féidir leat an lúb imeachta seo a dhíchumasú trí rith:</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>%autoawait off\n</code></pre></div>\n<p>mar ordú ag an iPython pras. Ligfidh sé seo duit cód sioncrónach a reáchtáil gan earráidí: exc: ~django.core.exceptions.synchronousOnlyOperation a ghiniúint; áfach, ní bheidh tú in ann APIs asincrónacha <code class=\"docutils literal notranslate\">feith</code> a dhéanamh freisin. Chun lúb an imeachta a chasadh ar ais, rith:</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>%autoawait on\n</code></pre></div>\n<p>Má tá tú i dtimpeallacht seachas IPython (nó mura féidir leat <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>autowait <a href=\"#id3\"><span class=\"problematic\" id=\"id4\">``</span></a>a mhúchadh i iPython ar chúis éigin), tá tú cinnte* nach bhfuil aon seans ann go ndéanfar do chód a reáchtáil ag an am céanna, agus ní mór duit <em>go hiomlán</em> do chód sioncrónaithe a reáchtáil ó chomhthéacs async, ansin is féidir leat an rabhadh a dhíchumasú trí:envvar: DJANGO_ALLOW_ASYNC_UNEAFE_ASYNC_UN comhshaoil athraitheach go luach ar bith.</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Warning</p>\n<p>Má chumasaíonn tú an rogha seo agus má tá rochtain chomhthráthach ann ar na codanna asínc-neamhshábháilte de Django, d'fhéadfadh caillteanas sonraí nó éilliú a bheith ort. Bí an-chúramach agus ná húsáid é seo i dtimpeallachtaí táirgeachta.</p>\n</aside>\n<p>Más gá duit é seo a dhéanamh ó laistigh de Python, déan é sin le os.environment `:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">import</span> <span class=\"nn\">os</span>\n\nos<span class=\"o\">.</span>environ<span class=\"p\">[</span><span class=\"s2\">&quot;DJANGO_ALLOW_ASYNC_UNSAFE&quot;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;true&quot;</span>\n</code></pre></div>\n</section>\n<section id=\"async-adapter-functions\">\n<h2>Feidhmeanna cuibheoir async<a class=\"heading-anchor\" href=\"#async-adapter-functions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Is gá an stíl ghlaonna a oiriúnú agus tú ag glaoch ar chód sioncrónaithe ó chomhthéacs async, nó a mhalairt. Chuige seo tá dhá fheidhm oiriúnaitheora ann, ón modúl <code class=\"docutils literal notranslate\">asgiref.sync</code>: :func: async_to_sync agus:func: sync_to_async. Úsáidtear iad chun aistriú idir na stíleanna glaonna agus comhoiriúnacht á chaomhnú.</p>\n<p>Úsáidtear na feidhmeanna cuibheora seo go forleathan i Django. Tá an pacáiste: pypi: asgiref féin mar chuid de thionscadal Django, agus suiteáiltear é go huathoibríoch mar spleáchas nuair a shuiteálann tú Django le <code class=\"docutils literal notranslate\">pip</code>.</p>\n<section id=\"async-to-sync\">\n<h3><a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>async_to_sync () ``<a class=\"heading-anchor\" href=\"#async-to-sync\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"asgiref.sync.async_to_sync\">\n<span class=\"sig-name descname\">async_to_sync</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">async_function</em>, <em class=\"sig-param\">force_new_loop<span class=\"o\">=</span><span class=\"default_value\">False</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#asgiref.sync.async_to_sync\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Glacann sé feidhm async agus filleann sé feidhm sioncrónaithe a fhilleann é. Is féidir é a úsáid mar fhilleadh díreach nó mar mhaisitheoir:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">asgiref.sync</span> <span class=\"kn\">import</span> async_to_sync\n\n\n<span class=\"k\">async</span> <span class=\"k\">def</span> <span class=\"nf\">get_data</span><span class=\"p\">():</span> <span class=\"o\">...</span>\n\n\nsync_get_data <span class=\"o\">=</span> async_to_sync<span class=\"p\">(</span>get_data<span class=\"p\">)</span>\n\n\n<span class=\"nd\">@async_to_sync</span>\n<span class=\"k\">async</span> <span class=\"k\">def</span> <span class=\"nf\">get_other_data</span><span class=\"p\">():</span> <span class=\"o\">...</span>\n</code></pre></div>\n<p>Reáchtáiltear an fheidhm async sa lúb imeachta don snáithe reatha, má tá ceann i láthair. Mura bhfuil lúb imeachta reatha ann, déantar lúb imeachta nua a chasadh suas go sonrach don iontráil async aonair agus dúnadh síos arís nuair a bheidh sé críochnaithe. I gceachtar cás, déanfaidh an fheidhm async a fhorghníomhú ar snáithe difriúil leis an gcód glaonna.</p>\n<p>Caomhnaítear luachanna snáithe agus comhthéacsúla thar an teorainn sa dá threo.</p>\n<p><a class=\"reference internal\" href=\"#asgiref.sync.async_to_sync\" title=\"asgiref.sync.async_to_sync\"><code class=\"xref py py-func docutils literal notranslate\">async_to_sync()</code></a> is essentially a more powerful version of the\n<a class=\"reference external\" href=\"https://docs.python.org/3/library/asyncio-runner.html#asyncio.run\" title=\"(in Python v3.14)\"><code class=\"xref py py-func docutils literal notranslate\">asyncio.run()</code></a> function in Python's standard library. As well\nas ensuring threadlocals work, it also enables the <code class=\"docutils literal notranslate\">thread_sensitive</code> mode of\n<a class=\"reference internal\" href=\"#asgiref.sync.sync_to_async\" title=\"asgiref.sync.sync_to_async\"><code class=\"xref py py-func docutils literal notranslate\">sync_to_async()</code></a> when that wrapper is used below it.</p>\n</section>\n<section id=\"sync-to-async\">\n<h3><a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>sync_to_async () ``<a class=\"heading-anchor\" href=\"#sync-to-async\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"asgiref.sync.sync_to_async\">\n<span class=\"sig-name descname\">sync_to_async</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">sync_function</em>, <em class=\"sig-param\">thread_sensitive<span class=\"o\">=</span><span class=\"default_value\">True</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#asgiref.sync.sync_to_async\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Glacann sé feidhm sioncrónaithe agus filleann sé feidhm async a fhilleann é. Is féidir é a úsáid mar fhilleadh díreach nó mar mhaisitheoir:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">asgiref.sync</span> <span class=\"kn\">import</span> sync_to_async\n\nasync_function <span class=\"o\">=</span> sync_to_async<span class=\"p\">(</span>sync_function<span class=\"p\">,</span> thread_sensitive<span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\nasync_function <span class=\"o\">=</span> sync_to_async<span class=\"p\">(</span>sensitive_sync_function<span class=\"p\">,</span> thread_sensitive<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n\n\n<span class=\"nd\">@sync_to_async</span>\n<span class=\"k\">def</span> <span class=\"nf\">sync_function</span><span class=\"p\">():</span> <span class=\"o\">...</span>\n</code></pre></div>\n<p>Caomhnaítear luachanna snáithe agus comhthéacsúla thar an teorainn sa dá threo.</p>\n<p>Is gnách go scríobhtar feidhmeanna sioncrónaithe ag glacadh leis go ritheann siad go léir sa phríomhsnáithe, mar sin: func: tá dhá mhodh snáithe ag sync_to_async:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\">thread_sensitive=True</code> (an réamhshocraithe): rithfidh an fheidhm sioncrónaithe sa snáithe céanna le gach feidhm <code class=\"docutils literal notranslate\">thread_sensitive</code> eile. Is é seo an príomh-snáithe, má tá an príomh-snáithe sioncrónach agus má tá an fillteán: func: async_to_sync á úsáid agat.</p></li>\n<li><p><code class=\"docutils literal notranslate\">thread_sensitive=False</code>: reáchtálfaidh an fheidhm sioncrónaithe i snáithe úrnua a dhúnadh ansin nuair a bheidh an t-ionghairm críochnaithe.</p></li>\n</ul>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Warning</p>\n<p>D'athraigh leagan <code class=\"docutils literal notranslate\">asgiref</code> 3.3.0 luach réamhshocraithe an pharaiméadar <code class=\"docutils literal notranslate\">thread_sensitive</code> go <code class=\"docutils literal notranslate\">True</code>. Is réamhshocrú níos sábháilte é seo, agus i go leor cásanna ag idirghníomhú le Django an luach ceart, ach bí cinnte úsáidí sync_to_async () `a mheas má nuashonraíonn ``asgiref` ó leagan roimhe seo.</p>\n</aside>\n<p>Tá modh íogair do snáithe speisialta go leor, agus déanann sé go leor oibre chun gach feidhm a reáchtáil sa snáithe céanna. Tabhair faoi deara, áfach, go mbraitheann sé ar úsáid*: func: async_to_sync <em>os cionn é sa chrú</em> chun rudaí a reáchtáil i gceart ar an bpríomh-snáithe. Má úsáideann tú <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>asyncio.run () <a href=\"#id3\"><span class=\"problematic\" id=\"id4\">``</span></a>nó dá leithéid, tiocfaidh sé ar ais ar fheidhmeanna íogair snáithe a reáchtáil i snáithe amháin, roinnte, ach ní hé seo an príomh-snáithe.</p>\n<p>Is é an fáth a bhfuil gá leis seo i Django ná go n-éilíonn go leor leabharlanna, go sonrach oiriúnaitheoirí bunachar sonraí, go ndéantar rochtain orthu sa snáithe céanna a cruthaíodh iad. Chomh maith leis sin glacann go leor de chód Django atá ann cheana go ritheann sé go léir sa snáithe céanna, m.sh. middleware ag cur rudaí le hiarratas lena n-úsáid níos déanaí i dtuairimí.</p>\n<p>Seachas saincheisteanna comhoiriúnachta féideartha a thabhairt isteach leis an gcód seo, roghnaíomar ina ionad sin an modh seo a chur leis ionas go rithfidh gach cód sioncrónaithe Django atá ann cheana sa snáithe céanna agus dá bhrí sin go mbeidh sé comhoiriúnach Tabhair faoi deara go mbeidh cód sioncrónaithe i snáith* difriol* i gcónaí le haon chód async atá ag glaoch air, mar sin ba cheart duit láimhseálacha bunachar sonraí amh nó tagairtí eile atá íogair do shnáithe a sheachaint timpeall.</p>\n<p>Go praiticiúil ciallaíonn an srian seo nár chóir duit gnéithe den réad bunachar sonraí nasc` a rith agus tú ag glaoch ar sync_to_async () `. Spreagfaidh sé sin na seiceálacha sábháilteachta snáithe:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"go\"># DJANGO_SETTINGS_MODULE=settings.py python -m asyncio</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">import</span> <span class=\"nn\">asyncio</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">asgiref.sync</span> <span class=\"kn\">import</span> sync_to_async\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> connection\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># In an async context so you cannot use the database directly:</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>connection<span class=\"o\">.</span>cursor<span class=\"p\">()</span>\n<span class=\"go\">django.core.exceptions.SynchronousOnlyOperation: You cannot call this from</span>\n<span class=\"go\">an async context - use a thread or sync_to_async.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># Nor can you pass resolved connection attributes across threads:</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">await</span> sync_to_async<span class=\"p\">(</span>connection<span class=\"o\">.</span>cursor<span class=\"p\">)()</span>\n<span class=\"go\">django.db.utils.DatabaseError: DatabaseWrapper objects created in a thread</span>\n<span class=\"go\">can only be used in that same thread. The object with alias &#39;default&#39; was</span>\n<span class=\"go\">created in thread id 4371465600 and this is thread id 6131478528.</span>\n</code></pre></div>\n<p>Ina ionad sin, ba cheart duit gach rochtain bunachar sonraí a chumhdú laistigh de fheidhm chúntóra ar féidir a ghlaoch le <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>sync_to_async () <a href=\"#id3\"><span class=\"problematic\" id=\"id4\">`</span></a>gan brath ar an réad nasc sa chód glaonna.</p>\n</section>\n</section>","rootId":"asynchronous-support","toc":[{"title":"Tuairimí async","anchor":"async-views","children":[{"title":"Maisitheoirí","anchor":"decorators","children":[]},{"title":"Fiosrúcháin & an ORM","anchor":"queries-the-orm","children":[]},{"title":"feidhmíocht","anchor":"performance","children":[]},{"title":"Dícheangail láimhseáil","anchor":"handling-disconnects","children":[]}]},{"title":"Sábháilteacht async","anchor":"async-safety","children":[]},{"title":"Feidhmeanna cuibheoir async","anchor":"async-adapter-functions","children":[{"title":"``async_to_sync () ``","anchor":"async-to-sync","children":[]},{"title":"``sync_to_async () ``","anchor":"sync-to-async","children":[]}]}],"breadcrumbs":[{"docname":"topics/index","title":"Using Django","url":"/ga/5.2/topics/"}],"prev":{"docname":"topics/external-packages","title":"Pacáistí seachtr","url":"/ga/5.2/topics/external-packages/"},"next":{"docname":"howto/index","title":"Treoracha conas","url":"/ga/5.2/howto/"},"formats":{"html":"/ga/5.2/topics/async/","markdown":"/ga/5.2/topics/async.md","json":"/ga/5.2/topics/async.json"},"source":"https://github.com/django/django/blob/stable/5.2.x/docs/topics/async.txt","official":"https://docs.djangoproject.com/ga/5.2/topics/async/","inVersions":["6.1","6.0","5.2"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}