Python线程在创建时运行,而不是在运行()时调用

时间:2016-06-12 03:32:10

标签: python-2.7 python-multithreading

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

如果我的代码看起来笨拙/混乱,请告诉我。对于一般的编程,我有点新鲜。

编辑:

我遇到的另一个问题是我无法运行这两个线程,因为当一个线程启动时,另一个线程不能运行。为什么会这样,我该如何解决?

1 个答案:

答案 0 :(得分: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的子类可以覆盖它。