2016-06-12 3 views
1

파이썬 프로그램 (2.7)에서 스레드를 만들려고 시도하지만 시작될 때가 아니라 즉시 만들어지기 시작합니다.) 속성이 호출됩니다. 도움이 될 것입니다. 내 코드는 무질서/투박한 것 같으면Python 스레드 실행시 Run() 호출시 실행되지 않음

import sys 
import socket 
import threading 
global connections 
connections = [] 

def srcv(s, conn, data): 

    while True: 

     print "Recieving" 
     #Recieve Strings From Each Connection 
     for i, n in enumerate(connections): 

      data.append([connections[1], i.recv(4096)]) 

     #Send String To Each Connection 
     print "Sending" 
     for i, n in enumerate(connections): 

      i.send("{0}: {1}".format(data[n][0], data[n][1])) 

def listn(s, conn, data): 

    s.listen(10) 
    print "Listening For Connection" 
    while True: 

     obj, addr = s.accept() 
     connections.append([obj, addr]) 

def start_server(): 

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    conn = [] 
    data = [] 
    s.bind(("localhost", 12345)) 
    print "Creating Listening Thread" 
    listen = threading.Thread(target=listn(s,conn,data)) 
    print "Preparing Listening Thread" 
    listen.start() 
    print "Starting Listening Thread" 
    listen.run() 
    print "Creating Send/Receive Thread" 
    sandr = threading.Thread(target=srcv(s, conn, data)) 
    print "Preparing Send/Receive Thread" 
    sandr.start() 
    print "Connections Now Acceptable" 
    sandr.run() 

if __name__ == '__main__': 
    sys.exit(start_server()) 

내가 일반적으로 프로그래밍 다소 새로운 오전, 알려 주시기 바랍니다 :

은 여기 내 (서버) 코드입니다.

편집 :

I가 발생하는 또 다른 문제가 하나가 시작될 때, 다른 하나는 될 수 없기 때문에 내가 스레드의 모두를 실행할 수 있다는 것입니다. 왜 그런가요? 어떻게 고칠 수 있습니까?

listen.start() 전에 함수가 호출되지 않도록 당신은 args=에 인수를 넣어 사용할 필요가
+0

코디를 게시하고 싶을 수 있습니다. – amitnair92

+0

@ amitnair92 저기, 미안. –

답변

1

: 없음 또한

listen = threading.Thread(target=listn(s,conn,data)) 

당신이 .run()를 호출해서는 안

listen = threading.Thread(target=listn, args=(s,conn,data)) 

, .start()은 내부적으로 수행 새로 시작된 스레드에서. run 메서드가 있으므로 Thread의 하위 클래스가이 메서드를 재정의 할 수 있습니다.

+0

이 방법은 효과가 있지만 다른 문제가 있습니다. 두 스레드가 있기 때문에 다른 스레드를 시작하는 방법은 무엇입니까? –

+0

해답에 대한 의견 알림이 작동하는지 알지 못합니다. –

+0

첫 번째 스레드와 같은 방식입니다. 'target ='이'listn'보다는'srcv' 인 것을 제외하고는 다른 하나가 동일하기 때문에 나는 단지 한가지만을했습니다. –

관련 문제