<div dir="auto">Pretty sure you want to add a try/finally around that yield, so you release the lock on errors.</div><br><div class="gmail_quote"><div dir="ltr">On Tue, Apr 17, 2018, 14:39 Ludovic Gasc <<a href="mailto:gmludo@gmail.com">gmludo@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">2018-04-17 15:16 GMT+02:00 Antoine Pitrou <span dir="ltr"><<a href="mailto:solipsis@pitrou.net" target="_blank" rel="noreferrer">solipsis@pitrou.net</a>></span>:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br>
<br>
You could simply use something like the first 64 bits of<br>
sha1("myapp:<lock name>")<br></blockquote><div><br></div><div>I have followed your idea, except I used hashtext directly, it's an internal postgresql function that generates an integer directly.<br><br></div><div>For now, it seems to work pretty well but I didn't yet finished all tests.</div><div>The final result is literally 3 lines of Python inside an async contextmanager, I like this solution ;-) :</div><div><br></div><div><div>@asynccontextmanager</div><div>async def lock(env, category='global', name='global'):</div><div>    # Alternative lock id with 'mytable'::regclass::integer OID</div><div>    await env['aiopg']['cursor'].execute("SELECT pg_advisory_lock( hashtext(%(lock_name)s) );", {'lock_name': '%s.%s' % (category, name)})</div><div><br></div><div>    yield None</div><div><br></div><div>    await env['aiopg']['cursor'].execute("SELECT pg_advisory_unlock( hashtext(%(lock_name)s) );", {'lock_name': '%s.%s' % (category, name)})</div></div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
Regards<br>
<br>
Antoine.<br>
<br>
<br>
On Tue, 17 Apr 2018 15:04:37 +0200<br>
<div class="m_6167137454960255932gmail-HOEnZb"><div class="m_6167137454960255932gmail-h5">Ludovic Gasc <<a href="mailto:gmludo@gmail.com" target="_blank" rel="noreferrer">gmludo@gmail.com</a>> wrote:<br>
> Hi Antoine & Chris,<br>
> <br>
> Thanks a lot for the advisory lock, I didn't know this feature in<br>
> PostgreSQL.<br>
> Indeed, it seems to fit my problem.<br>
> <br>
> The small latest problem I have is that we have string names for locks,<br>
> but advisory locks accept only integers.<br>
> Nevertheless, it isn't a problem, I will do a mapping between names and<br>
> integers.<br>
> <br>
> Yours.<br>
> <br>
> --<br>
> Ludovic Gasc (GMLudo)<br>
> <br>
> 2018-04-17 13:41 GMT+02:00 Antoine Pitrou <<a href="mailto:solipsis@pitrou.net" target="_blank" rel="noreferrer">solipsis@pitrou.net</a>>:<br>
> <br>
> > On Tue, 17 Apr 2018 13:34:47 +0200<br>
> > Ludovic Gasc <<a href="mailto:gmludo@gmail.com" target="_blank" rel="noreferrer">gmludo@gmail.com</a>> wrote:  <br>
> > > Hi Nickolai,<br>
> > ><br>
> > > Thanks for your suggestions, especially for the file system lock: We  <br>
> > don't  <br>
> > > have often locks, but we must be sure it's locked.<br>
> > ><br>
> > > For 1) and 4) suggestions, in fact we have several systems to sync and  <br>
> > also  <br>
> > > a PostgreSQL transaction, the request must be treated by the same worker<br>
> > > from beginning to end and the other systems aren't idempotent at all,  <br>
> > it's  <br>
> > > "old-school" proprietary systems, good luck to change that ;-)  <br>
> ><br>
> > If you already have a PostgreSQL connection, can't you use a PostgreSQL<br>
> > lock?  e.g. an "advisory lock" as described in<br>
> > <a href="https://www.postgresql.org/docs/9.1/static/explicit-locking.html" rel="noreferrer noreferrer" target="_blank">https://www.postgresql.org/docs/9.1/static/explicit-locking.html</a><br>
> ><br>
> > Regards<br>
> ><br>
> > Antoine.<br>
> ><br>
> ><br>
> >  <br>
> <br>
<br>
<br>
<br>
</div></div><div class="m_6167137454960255932gmail-HOEnZb"><div class="m_6167137454960255932gmail-h5">_______________________________________________<br>
Async-sig mailing list<br>
<a href="mailto:Async-sig@python.org" target="_blank" rel="noreferrer">Async-sig@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/async-sig" rel="noreferrer noreferrer" target="_blank">https://mail.python.org/mailman/listinfo/async-sig</a><br>
Code of Conduct: <a href="https://www.python.org/psf/codeofconduct/" rel="noreferrer noreferrer" target="_blank">https://www.python.org/psf/codeofconduct/</a><br>
</div></div></blockquote></div><br></div></div>
_______________________________________________<br>
Async-sig mailing list<br>
<a href="mailto:Async-sig@python.org" target="_blank" rel="noreferrer">Async-sig@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/async-sig" rel="noreferrer noreferrer" target="_blank">https://mail.python.org/mailman/listinfo/async-sig</a><br>
Code of Conduct: <a href="https://www.python.org/psf/codeofconduct/" rel="noreferrer noreferrer" target="_blank">https://www.python.org/psf/codeofconduct/</a><br>
</blockquote></div>