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:
committed by
Ilya Maximets
parent
487253d5b8
commit
d28c5ca576
@@ -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:
|
||||
|
Reference in New Issue
Block a user