2016-06-12 67 views
1

在我的python程序(2.7)中,我尝试创建一个线程,但它在创建时立即启动,而不是在start()和run )属性被调用。帮助会很好。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()) 

请让我知道,如果我的代码看起来笨重/杂乱无章,我有些新的节目一般。

编辑:

我遇到的另一个问题是,我不能运行两个线程,因为一个人开始的时候,其他的都没有。为什么是这样,我该如何解决它?

+0

您可能想要发布您的小组。 – amitnair92

+0

@ amitnair92在那里,对不起。 –

回答

1

您需要使用将这些参数在args=使前listen.start()功能不叫:

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 ='是'srcv'而不是'listn'之外,我只做了一个。 –