Rosca de soquete e PyGTK

Estou tentando escrever um programa de mensagens instantâneas, a interface do usuário básica está quase concluída e estou analisando a parte de recebimento das mensagens. Eu tenho uma classe de interface do usuário e uma classe Receive_Socket encadeada. Cada vez que o soquete da classe Received_Socket recebe uma mensagem, ele executa um gobject.idle_add () para chamar um método de interface do usuário para exibir a mensagem em uma janela de bate-papo. Após a linha gobject.idle.add (), eu tenho um loop while que faz um loop até que a mensagem seja realmente exibida na janela de bate-papo (eu quero que a mensagem seja exibida antes de receber outra mensagem porque li esse gobject.idle_add () não garante a ordem de execução e, é claro, quero que as mensagens sejam exibidas em ordem :))

Eu tentei resumir meu código:

Classe da interface do usuário:

Class UI:
##### somewhere in the init #####
    self.message_status = 0
def chat_window(self, contact, message=0):
    Check if a chat window is opened for the contact, if not it opens one.
    => In reality this check if a gtk.Window containing a gtk.Notebook is opened, 
    => if not it opens one
    => Then it creates a page for the contact in the notebook, containing a 
    => gtk.Textview which displays messages
    if message:
        self.message_display(contact, message)
def message_display(self,a,b):
    => Display the message in the message in the contact's textview
    self.message_status = 1

Classe Receive_Socket encadeada:

Class Receive_Socket(threading.thread):
    message = sock.recv(1024)
    => the sender name is written in the message 
    if message:
        gobject.idle_add(myui.chat_window,sender, message)
        while not myui.message_status:
            time.sleep(0.1)
        myui.message_status = 0

Código principal:

if __name__ == "__main__":
    myui = UI()
    reception = Receive_Socket()
    reception.start()
    gtk.main()

Minhas perguntas :

1) Esse tipo de código parece eficiente? É (ter uma classe de recebimento encadeada junto com minha classe de interface do usuário) a melhor maneira de prosseguir?

2) Quando a mensagem é exibida, o soquete pode ter recebido 2 ou mais mensagens; portanto, quando receber message = sock.recv (1024) novamente, várias mensagens serão concatenadas na variável. Pensei em incluir o tamanho da mensagem em cada mensagem, portanto, se houver mais de uma mensagem nos 1024 bytes, ela receberá a mensagem e colocará o restante em uma variável message_buffer e antes de executar o sock.recv (1024) novamente, verificará se a variável message_buffer contém qualquer coisa e, se estiver, coloque o message_buffer na variável message em vez de sock.recv (1024). Existe uma solução mais fácil / melhor para fazer isso?

Desde já, obrigado,

Nolhian

questionAnswers(1)

yourAnswerToTheQuestion