Indeed, thanks for the suggestion :-)

Le mer. 18 avr. 2018 à 01:21, Nathaniel Smith <njs@pobox.com> a écrit :
Pretty sure you want to add a try/finally around that yield, so you release the lock on errors.

On Tue, Apr 17, 2018, 14:39 Ludovic Gasc <gmludo@gmail.com> wrote:
2018-04-17 15:16 GMT+02:00 Antoine Pitrou <solipsis@pitrou.net>:


You could simply use something like the first 64 bits of
sha1("myapp:<lock name>")

I have followed your idea, except I used hashtext directly, it's an internal postgresql function that generates an integer directly.

For now, it seems to work pretty well but I didn't yet finished all tests.
The final result is literally 3 lines of Python inside an async contextmanager, I like this solution ;-) :

@asynccontextmanager
async def lock(env, category='global', name='global'):
    # Alternative lock id with 'mytable'::regclass::integer OID
    await env['aiopg']['cursor'].execute("SELECT pg_advisory_lock( hashtext(%(lock_name)s) );", {'lock_name': '%s.%s' % (category, name)})

    yield None

    await env['aiopg']['cursor'].execute("SELECT pg_advisory_unlock( hashtext(%(lock_name)s) );", {'lock_name': '%s.%s' % (category, name)})

 

Regards

Antoine.


On Tue, 17 Apr 2018 15:04:37 +0200
Ludovic Gasc <gmludo@gmail.com> wrote:
> Hi Antoine & Chris,
>
> Thanks a lot for the advisory lock, I didn't know this feature in
> PostgreSQL.
> Indeed, it seems to fit my problem.
>
> The small latest problem I have is that we have string names for locks,
> but advisory locks accept only integers.
> Nevertheless, it isn't a problem, I will do a mapping between names and
> integers.
>
> Yours.
>
> --
> Ludovic Gasc (GMLudo)
>
> 2018-04-17 13:41 GMT+02:00 Antoine Pitrou <solipsis@pitrou.net>:
>
> > On Tue, 17 Apr 2018 13:34:47 +0200
> > Ludovic Gasc <gmludo@gmail.com> wrote: 
> > > Hi Nickolai,
> > >
> > > Thanks for your suggestions, especially for the file system lock: We 
> > don't 
> > > have often locks, but we must be sure it's locked.
> > >
> > > For 1) and 4) suggestions, in fact we have several systems to sync and 
> > also 
> > > a PostgreSQL transaction, the request must be treated by the same worker
> > > from beginning to end and the other systems aren't idempotent at all, 
> > it's 
> > > "old-school" proprietary systems, good luck to change that ;-) 
> >
> > If you already have a PostgreSQL connection, can't you use a PostgreSQL
> > lock?  e.g. an "advisory lock" as described in
> > https://www.postgresql.org/docs/9.1/static/explicit-locking.html
> >
> > Regards
> >
> > Antoine.
> >
> >
> > 
>



_______________________________________________
Async-sig mailing list
Async-sig@python.org
https://mail.python.org/mailman/listinfo/async-sig
Code of Conduct: https://www.python.org/psf/codeofconduct/

_______________________________________________
Async-sig mailing list
Async-sig@python.org
https://mail.python.org/mailman/listinfo/async-sig
Code of Conduct: https://www.python.org/psf/codeofconduct/