code: def write_message(self, message, binary=False, locked=True):
          ''' Write a message to the websocket after obtaining the appropriate
          Bokeh Document lock.
  
          '''
          def write_message_unlocked():
              if self._socket.protocol is None:
                  # Tornado is maybe supposed to do this, but in fact it
                  # tries to do _socket.protocol.write_message when protocol
                  # is None and throws AttributeError or something. So avoid
                  # trying to write to the closed socket. There doesn't seem
                  # to be an obvious public function to check if the socket
                  # is closed.
                  raise WebSocketError("Connection to the server has been closed")
  
              future = self._socket.write_message(message, binary)
  
              # don't yield this future or we're blocking on ourselves!
              raise gen.Return(future)
  
          if locked:
              with (yield self.write_lock.acquire()):
                  write_message_unlocked()
          else:
              write_message_unlocked(f write_message(self, message, binary=False, locked=True):
          ''' Write a message to the websocket after obtaining the appropriate
          Bokeh Document lock.
  
          '''
          def write_message_unlocked():
              if self._socket.protocol is None:
                  # Tornado is maybe supposed to do this, but in fact it
                  # tries to do _socket.protocol.write_message when protocol
                  # is None and throws AttributeError or something. So avoid
                  # trying to write to the closed socket. There doesn't seem
                  # to be an obvious public function to check if the socket
                  # is closed.
                  raise WebSocketError("Connection to the server has been closed")
  
              future = self._socket.write_message(message, binary)
  
              # don't yield this future or we're blocking on ourselves!
              raise gen.Return(future)
  
          if locked:
              with (yield self.write_lock.acquire()):
                  write_message_unlocked()
          else:
              write_message_unlocked()
docs: Write a message to the websocket after obtaining the appropriate
          Bokeh Document lock.