2013-05-01 3 views
0

, связанных с моим последним сообщением (которое каким-то образом было помечено и закрыто), Я написал код для создания потока для обработчика команд для моего прослушивателя TCP на Python. Что в основном происходит, так это то, что я отправляю некоторые данные и идет в TCP-подключении. Затем TCP-коннектор создает другой процесс и отправляет данные, полученные им через процесс, в функцию в прослушивателе команд. Я не знаю, что происходит. Пожалуйста помоги!Многопроцессор с Python и Аргументы

  import socket 
    import sys 
    import errno 
    from multiprocessing import Process, Queue # @UnresolvedImport 
    import CommandHandler 


    class tcpconnection: 
     def tcp(self): 
      data = '' 
      q = Queue() 
      p = Process(target=CommandHandler.CommandHandler.commands(), args=(self, data)) 
      # 
      HOST = ''     # Symbolic name meaning all available interfaces 
      PORT = 9999    # Arbitrary non-privileged port 
      s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
      s.bind((HOST, PORT)) 
      s.listen(1) 
      conn, addr = s.accept() 
      print('Connected by', addr) 
      while True: 
       data = conn.recv(1024) 
       p.start() 
       p.join() 
       if not data: break 
       conn.send(data) 
      conn.close() 

Говорит, что:

p = Process(target=CommandHandler.CommandHandler.commands(), args=(self, data)) 
    TypeError: unbound method commands() must be called with CommandHandler instance as first argument (got nothing instead) 

ответ

1

target=CommandHandler.CommandHandler.commands() устанавливает target аргумент в результате вызова метода commands. То, что вы, вероятно, намеревался сделать, чтобы использовать этот метод, как tharget, так что вы должны использовать:

p = Process(target=CommandHandler.CommandHandler.commands, args=(self, data)) 

Также ошибка говорит вам, что вы пытаетесь вызвать несвязанный метод на классе, но вам нужен объект назвать его, вероятно:

p = Process(target=CommandHandler.CommandHandler().commands, args=(self, data)) 

, но это не единственный вопрос:

while True: 
    data = conn.recv(1024) 
    p.start() 
    p.join() 

Этот цикл будет терпеть неудачу после первого вызова, потому что вы не можете перезапустить уже начатый процесс.

+0

Но как мне создать новый процесс или закрыть старый? – waco001

+0

вам нужно создать новый экземпляр процесса каждый раз. действительно ли вы хотите начать новый процесс для каждого полученного пакета? как правило, вы сделаете это для каждого принятого соединения ... – mata

+0

mata, как бы я по-прежнему передавать строки другому процессу? С помощью одного процесса? Thx – waco001

Смежные вопросы