@@ -88,6 +88,7 @@ def __init__(self, reader, writer, encoder=json.JSONEncoder()):
8888 self ._methods = {}
8989 self ._notifications = {}
9090 self ._task_manager = TaskManager ("jsonrpc server" )
91+ self ._write_lock = asyncio .Lock ()
9192
9293 def register_method (self , name , callback , immediate , sensitive_params = False ):
9394 """
@@ -223,12 +224,16 @@ def _parse_request(data):
223224 raise InvalidRequest ()
224225
225226 def _send (self , data ):
227+ async def send_task (data_ ):
228+ async with self ._write_lock :
229+ self ._writer .write (data_ )
230+ await self ._writer .drain ()
231+
226232 try :
227233 line = self ._encoder .encode (data )
228234 logging .debug ("Sending data: %s" , line )
229235 data = (line + "\n " ).encode ("utf-8" )
230- self ._writer .write (data )
231- self ._task_manager .create_task (self ._writer .drain (), "drain" )
236+ self ._task_manager .create_task (send_task (data ), "send" )
232237 except TypeError as error :
233238 logging .error (str (error ))
234239
@@ -263,6 +268,7 @@ def __init__(self, writer, encoder=json.JSONEncoder()):
263268 self ._encoder = encoder
264269 self ._methods = {}
265270 self ._task_manager = TaskManager ("notification client" )
271+ self ._write_lock = asyncio .Lock ()
266272
267273 def notify (self , method , params , sensitive_params = False ):
268274 """
@@ -286,12 +292,16 @@ async def close(self):
286292 await self ._task_manager .wait ()
287293
288294 def _send (self , data ):
295+ async def send_task (data_ ):
296+ async with self ._write_lock :
297+ self ._writer .write (data_ )
298+ await self ._writer .drain ()
299+
289300 try :
290301 line = self ._encoder .encode (data )
291302 data = (line + "\n " ).encode ("utf-8" )
292303 logging .debug ("Sending %d byte of data" , len (data ))
293- self ._writer .write (data )
294- self ._task_manager .create_task (self ._writer .drain (), "drain" )
304+ self ._task_manager .create_task (send_task (data ), "send" )
295305 except TypeError as error :
296306 logging .error ("Failed to parse outgoing message: %s" , str (error ))
297307
0 commit comments