2016-06-12 25 views
1

Pythonプログラム(2.7)でスレッドを作成しようとしましたが、作成時に起動されます。 )属性が呼び出されます。ヘルプは素晴らしいだろう。ここでPythonスレッドが実行時に実行され、実行時に呼び出されない

が私の(サーバー)のコードです:

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()) 

私のコードは、無秩序/不格好と思われる場合は私に知らせてください、私は一般的なプログラミングに幾分新しいです。

EDIT:

私が遭遇したもう一つの問題は、1の起動時に、他のことができないとして、私は、スレッドの両方を実行できないことです。それはなぜですか、どうすれば修正できますか?

+0

あなたのコッドを投稿することができます。 – amitnair92

+0

@ amitnair92すみません、ごめんなさい。 –

答えて

1

あなたは関数がlisten.start()前に呼び出されないようにargs=で引数を置く使用する必要があります。

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

ない

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

また、あなたが.run()を呼び出すべきではありません、.start()は、その内部で行います新たに開始されたスレッドでrunメソッドがあるので、Threadのサブクラスがそれをオーバーライドすることができます。

+0

これはうまくいきますが、私は別の問題があります:他のスレッドを開始するにはどうすればいいですか? –

+0

答えに関するコメントの通知が機能するかどうかはわかりません。 –

+0

最初のスレッドと同じ方法です。私は 'target ='が 'listn'ではなく' srcv'であることを除いて、もう一方が同じであるということだけを行いました。 –

関連する問題