2
0
mirror of https://github.com/openvswitch/ovs synced 2025-10-17 14:28:02 +00:00

python: Add cooperative_yield() API method to Idl.

When using eventlet monkey_patch()'d code, greenthreads can be
blocked on connection for several seconds while the database
contents are parsed. Eventlet recommends adding a sleep(0) call
to cooperatively yield in cpu-bound code. asyncio code has
asyncio.sleep(0). This patch adds an API  method that defaults to
doing nothing, but can be overridden to yield as needed.

Signed-off-by: Terry Wilson <twilson@redhat.com>
Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
This commit is contained in:
Terry Wilson
2021-07-01 18:19:33 +00:00
committed by Ilya Maximets
parent 487253d5b8
commit d28c5ca576
2 changed files with 16 additions and 0 deletions

View File

@@ -481,6 +481,15 @@ class Idl(object):
:type updates: Row
"""
def cooperative_yield(self):
"""Hook for cooperatively yielding to eventlet/gevent/asyncio/etc.
When a block of code is going to spend a lot of time cpu-bound without
doing any I/O, it can cause greenthread/coroutine libraries to block.
This call should be added to code where this can happen, but defaults
to doing nothing to avoid overhead where it is not needed.
"""
def __send_cond_change(self, table, cond):
monitor_cond_change = {table.name: [{"where": cond}]}
old_uuid = str(self.uuid)
@@ -646,6 +655,8 @@ class Idl(object):
'is not an object'
% (table_name, uuid_string))
self.cooperative_yield()
if version == OVSDB_UPDATE2:
changes = self.__process_update2(table, uuid, row_update)
if changes: