@small-newbie

Как в Python отправить сообщение из потока в другой поток?

Есть небольшое приложение на Python, которое принимает соединения от клиентов. Каждое соединение определяется в отдельный поток. Необходимо реализовать связь между двумя рандомными клиентами.
В данном случае, каждому поток присваивается имя, которое берётся из присланных клиентом данных (например, "id1"). После того, как подключились 4 клиента (id1-id4), подключается id5 и в этот момент необходимо отправить сообщение id3 о том, что 5 пришёл. То бишь, if self.getName() == 'id5', то... что?
Или имеет смысл реализовать как-то иначе? Собирать подключения в массив и потом по нему искать того, кому отправить? Как этот вариант реализовать в коде, в таком случае?
import pickle, socket, threading, string
stat = True
class ClientThread(threading.Thread):

     def __init__(self, channel, details):
         self.channel = channel
         self.details = details
         threading.Thread.__init__(self)

     def run(self):
         data = self.channel.recv(1024)
         self.setName(data)

         print self.getName()
         self.channel.close()
         print 'Closed connection:', self.details[0]

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind('8.8.8.8', 8088)
server.listen(5)

while stat:
     channel, details = server.accept()
     ClientThread(channel, details).start()


UPD:
Со вторым вариантом разобрался вроде: в самом начале создаём пустой словарь, а в методе run класса помещаем данные о сокете в этот словарь (conn[self.getName()] = self). Ну а при условии if self.getName() == 'id5' делаем, например, conn['id3'].channel.send('WOW').
Однако, хороший ли это способ? Стоит ли так делать?
  • Вопрос задан
  • 3172 просмотра
Пригласить эксперта
Ответы на вопрос 2
Сам сильно не вкапывался (задача позволяла просто подключить Celery), но нужно копать в сторону shared memory, или таки пошуршать сигналы в Celery
Ответ написан
Комментировать
vvpoloskin
@vvpoloskin
Инженер связи
Схематично так
class ClientThread(threading.Thread):

   def sendmsg(self, worker, msg):
      worker.msg = msg

   def processmsg(self, msg):
       do_something(msg)

   def run(self):
      if name == "id5":
          self.sendmsg(worker, msg)


worker = ClientThread(channel, details)
worker.start()


А вообще часто для потоков используют какой-нибудь контейнер хранения - список, очередь. Посмотрите в сторону ThreadPool
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы