>> Why would you need locks for async? Is it to sync with things outside of
the async process?

`asyncio.Lock` is needed to lock across async operations. (If there is an
`await` in the body for the lock).


Le ven. 26 févr. 2021 à 10:45, Barry Scott <ba...@barrys-emacs.org> a
écrit :

>
>
> On 26 Feb 2021, at 08:31, Jonathan Slenders <jonat...@slenders.be> wrote:
>
> Barry,
>
> What you describe sounds like `asyncio.gather(...)` if I understand
> correctly.
>
> The thing with a Barier is that it's usable in situations where we don't
> know the other tasks. Maybe there is no reference to them from the current
> scope. Maybe they are even not yet created.
> It certainly can be done with a list of `asyncio.Future` and
> `asyncio.gather(...)`, but that's a lot of boilerplate.
>
> IMHO, Yves is right. For both asyncio and threading, we have Lock, Event,
> Condition, Semaphore and BoundedSemaphore. Only Barier is missing among the
> asyncio primitives. (RLock doesn't make sense.)
>
>
> Why would you need locks for async? Is it to sync with things outside of
> the async process?
>
> With the large and complex async app I work on there are no locks at all.
>
> (I guess we can probably go to bugs.python.org with this proposal.)
>
>
> Having shown that a Barrier for async is a missing piece it would be good
> to get a thumbs up here.
>
> Barry
>
>
> Jonathan
>
>
>
>
>
>
> Le jeu. 25 févr. 2021 à 23:38, Barry Scott <ba...@barrys-emacs.org> a
> écrit :
>
>>
>>
>> On 25 Feb 2021, at 17:15, Jonathan Slenders <jonat...@slenders.be> wrote:
>>
>> It does make sense to have a barrier synchronization primitive for
>> asyncio.
>> The idea is to make a coroutine block until at least X coroutines are
>> waiting to enter the barrier.
>> This is very useful, if certain actions need to be synchronized.
>>
>>
>> I do most of my async coding with twisted where what you calling a
>> barrier is a DeferredList.
>>
>> The way its used is that you add in all the deferreds that you want to
>> complete before you continue
>> into the list. Once all the deferered have competed the DefferedList
>> completes and its callback is run.
>>
>> Barry
>>
>>
>>
>> Recently, I had to implement a barier myself for our use case. See code
>> below:
>>
>> It is simple to implement, but I too would like to have one for asyncio,
>> in order to be consistent with the concurrency primitives we have for
>> threading.
>>
>> Jonathan
>>
>>
>> class Barier:
>>     """
>>     Make a coroutine block until there are at least X waiters.
>>
>>     Similar to the threading Barier objects but for asyncio:
>>     https://docs.python.org/3/library/threading.html#barrier-objects
>>     """
>>
>>     def __init__(self, parties: int) -> None:
>>         self.parties = parties
>>         self._waiting: int
>>         self._event = asyncio.Event()
>>
>>     def add_one(self) -> None:
>>         self._waiting += 1
>>         if self._waiting == self.parties:
>>             self._event.set()
>>
>>     async def wait(self, worker: "Worker") -> None:
>>         """
>>         Wait until all we have at least `parties` waiters.
>>         """
>>         self.add_one()
>>         await self._event.wait()
>>
>>
>>
>>
>> Le jeu. 25 févr. 2021 à 16:42, Barry Scott <ba...@barrys-emacs.org> a
>> écrit :
>>
>>>
>>>
>>> > On 25 Feb 2021, at 13:14, Yves Duprat <ydup...@gmail.com> wrote:
>>> >
>>> > Hi,the list,
>>> >
>>> > I'm wondering why Barrier object does not exist in the synchronization
>>> primitives of the asyncio lib while it is present in threading and
>>> multiprocessing libs ?
>>> > This may not be the right place to ask this question, but I never
>>> found an answer on the web.
>>> > Thanks for your help.
>>>
>>>
>>> I'm assuming that the barrier you are speaking of is the mechanism that
>>> is used to
>>> synchronise threads/processes running in parallel to prevent data races.
>>>
>>> With async code that is never an issue. Each function runs to completion
>>> uninterrupted.
>>> There are no data races. Each time a async function runs it can know
>>> that the state of
>>> the objects it uses will not be changed while it is running.
>>>
>>> Barry
>>>
>>>
>>>
>>> >
>>> > Yves
>>> > _______________________________________________
>>> > Python-ideas mailing list -- python-ideas@python.org
>>> > To unsubscribe send an email to python-ideas-le...@python.org
>>> > https://mail.python.org/mailman3/lists/python-ideas.python.org/
>>> > Message archived at
>>> https://mail.python.org/archives/list/python-ideas@python.org/message/IAFAH7PWMUDUTLXYLNSXES7VMDQ26A3W/
>>> > Code of Conduct: http://python.org/psf/codeofconduct/
>>> >
>>> _______________________________________________
>>> Python-ideas mailing list -- python-ideas@python.org
>>> To unsubscribe send an email to python-ideas-le...@python.org
>>> https://mail.python.org/mailman3/lists/python-ideas.python.org/
>>> Message archived at
>>> https://mail.python.org/archives/list/python-ideas@python.org/message/B6WDPXNZH5KYK2BLHJXUFZF2DLFBLCBR/
>>> Code of Conduct: http://python.org/psf/codeofconduct/
>>>
>>
>>
>
_______________________________________________
Python-ideas mailing list -- python-ideas@python.org
To unsubscribe send an email to python-ideas-le...@python.org
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at 
https://mail.python.org/archives/list/python-ideas@python.org/message/ERK5INXFTSQX6NSISIN7JAYZTOXU7D3G/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to