1

스레딩 모듈을 사용하는 파이썬에서, 내 프로그램은 내가 동시에 만든 2 개의 스레드를 실행하지 않습니다. 나는 P2P를 사용하여 인스턴트 메시지 프로그램을 만들려고하는데 문제가 소켓 모듈과 관련이 있는지 또는 잘못된 것을하고 있는지 알지 못합니다. 코드 :스레드가 동시에 실행되지 않습니다. (Python)

import socket 
import threading 

class Receiver: 
    def __init__(self): 

     # Create socket that supports IPv4, TCP Protocol 
     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     print "Socket created." 
     # Requests for IP of host (DNS) 
     dns = "localhost" 
     HOST = '' 
     PORT = 57492 
     s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
     s.bind((HOST, PORT)) # Listens on all interfaces... 
     print 'Listening on port 25565' 
     s.listen(True) # Listen on the newly created socket... 
     conn, addr = s.accept() 
     print 'Connected in port 25565' 
     global data 
     while 1: 
      data = conn.recv(1024) 
      print data 
     s.close() 

    def Sender(self): 

     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     dns = "localhost" 
     HOST = socket.gethostbyname(dns) 
     PORT = 57492  
     # Connect to server 
     s.connect((HOST, PORT)) 

     print "Socket connected to " + dns + " on IP " + HOST 

     while 1: 

      # Assign message to be sent to server to a variable 
      message = raw_input("Message to be sent to server: ") 

      #Send the actual message to server 
      s.sendall(message) 
     print "Message sent successfully" 
     s.close() 
    def go(self): 

     th1 = threading.Thread() 
     th2 = threading.Thread(target=self.Sender) 
     th1.start() 
     th2.start() 

t = Receiver() 
t.go() 
+0

당신이 무엇을 기대를'th1'는 할까? 당신은'target'을주지 않았기 때문에 당신이 그것을 만든 직후에 죽습니다. – roippi

답변

1

여기에는 두 가지 문제가 있습니다. 첫째, th1에는 실행할 메서드가 제공되지 않으므로 start을 호출하면 스레드가 아무 작업도 수행하지 않고 즉시 종료됩니다. 두 번째 문제는 Receiver 클래스의 생성자에서 영구 작업 (무한 while 루프)을 수행하고 있다는 것입니다. 즉, t = Receiver() 라인은 (기본적으로) 결코 돌아 오지 않으며, go()으로 전화하지 않습니다.

여기에 예를 들어 당신이 설정했습니다 기본 프레임 워크에서 두 개의 스레드를 시작하는 방법을 모든 소켓 물건의 제거와 함께,이다 :

#!/usr/bin/python 

import threading 
import time 
import signal 

class Communicator: 
    def __init__(self): 
     self.__stop = False 

    def __runSender(self): 
     # setup sender here 
     while not self.__stop: 
      # run sender loop here 
      print "in sender" 
      time.sleep(1) 
     print "stopped sender" 

    def __runReceiver(self): 
     # setup receiver here 
     while not self.__stop: 
      # run recevier loop here 
      print "in receiver" 
      time.sleep(1) 
     print "stopped receiver" 

    def start(self): 
     senderThread = threading.Thread(target=self.__runSender) 
     receiverThread = threading.Thread(target=self.__runReceiver) 
     senderThread.start() 
     receiverThread.start() 
    def stop(self): 
     self.__stop = True 


c = Communicator() 

def handleKill(n, frame): 
    print "HANDLING SIGNAL" 
    c.stop() 

signal.signal(signal.SIGINT, handleKill) 
print "Starting communication, hit CTRL-c to stop" 
c.start() 
signal.pause() 
0

Sendergo 방법이 들여 쓰기되지 않으며 당신이 th2를 정의 할 때 더 self.Sender가 없다는 것을 의미 수신기의 그러므로 일부가 아닌.

+0

미안하지만 그건 내 잘못 이었어. 나는 질문을 입력하는 동안 코드를 들여 쓰는 것을 잊었다. 나는 그것을 편집했다, 이것은 실제 코드이다. – spider93286

0

이 라인 :

th1 = threading.Thread() 
th2 = threading.Thread(target=self.Sender) 

th1 실행 할 작업이 없습니다.

또 다른 걱정거리는 전역 변수 data을 갖고 있으며이 전체 클래스를 여러 번 실행하려는 경우 여러 스레드가 해당 변수를 파괴하여 정크 결과를 얻는 것입니다. 또는 SenderReceiver을 동시에 실행할 계획입니까? 당신이 가진 대답은 아마도 th1 매개 변수를 target=self으로 전달하는 것입니다.하지만 이것은 스레드 응용 프로그램 (스레드 내의 스레드?)을 실행하는 끔찍한 방법처럼 보입니다. 이 완전히 문제를 해결할 경우

class Conversation: 
    def __init__(self): 
     pass 

    def receiver(self): 
     ...code code code... 

    def sender(self): 
     ...code code code... 

    def go(self): 

     th1 = threading.Thread(target=self.receiver) 
     th2 = threading.Thread(target=self.render) 
     th1.start() 
     th2.start() 

나도 몰라 :

는 후자의 경우, 당신은 아마 별도의 방법으로 보낸 사람과받는 사람을 분리하고이 별도의 방법을 타겟팅 할 스레드를 설정하는 것이 더 낫다 ,하지만 그것은 시작입니다 : 그것은 그것이 그렇게되도록 th1 할 일이 있습니다.

또한 루프 종료를 알려주는 스레드로부터 안전한 방법이 필요하다고 생각합니다.

마지막으로, 현재 쓰레드와 같은 코드로 이러한 쓰레드간에 데이터를 안전하게 전달할 수 없다는 것을 명심하십시오.