首页 > 解决方案 > Python线程与连接作为循环连接

问题描述

我无法在与服务器的 1 个连接上启动 2 个单独的线程。我想循环运行 2 个函数,看起来它们是一个一个执行的。是否有任何其他选项可以每 x 秒/分钟运行一次功能?

线程是好用的工具吗?

import time
import datetime
from threading import Thread

def func1(ts3conn):
    print(f"func 1, pause 2sec NOW:{datetime.datetime.now()}")
    time.sleep(2)

def func2(ts3conn):
    print(f"func2, pause 10sec NOW:{datetime.datetime.now()}")
    time.sleep(10)

if __name__ == "__main__":

    with ts3.query.TS3ServerConnection("telnet://serveradmin:passwod@1.2.3.4:10011") as ts3conn:
        ts3conn.exec_("use", sid=1)
        ts3conn.exec_("clientupdate", client_nickname="BOT")
        while True:
            Thread(target=func1(ts3conn)).start()
            Thread(target=func2(ts3conn)).start()

func 1, pause 2sec NOW:2019-08-24 23:53:19.139951
func2, pause 10sec NOW:2019-08-24 23:53:21.141273
func 1, pause 2sec NOW:2019-08-24 23:53:31.141770
func2, pause 10sec NOW:2019-08-24 23:53:33.142568
func 1, pause 2sec NOW:2019-08-24 23:53:43.143090
func2, pause 10sec NOW:2019-08-24 23:53:45.143880

标签: pythonpython-multithreading

解决方案


target参数需要一个可调用的(即函数),但是您传递的是调用该可调用的结果,并且sleep甚至在创建线程之前就发生了。

所以代替这个:

Thread(target=func1(ts3conn)).start()

...尝试这样的事情:

Thread(target=func1, args=(ts3conn,)).start()

不幸的是,当您解决此问题时,您将遇到另一个问题:while 循环不会在创建新线程之前等待线程完成,而是会继续创建新线程,直到应用程序崩溃。您可能想尝试这样的事情:

while True:
    t1 = Thread(target=func1, args=(ts3conn,))
    t2 = Thread(target=func2, args=(ts3conn,))
    t1.start()
    t2.start()

    # wait for the threads to finish
    t1.join()
    t2.join()

推荐阅读