python - 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
解决方案
该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()
推荐阅读
- pandas - 使用 jupyter notebook 对 pandas 中的 GROUPED 数据框执行条件语句
- python - 有效地将整数列转换为 HH:MM:SS 格式的时间
- c# - 重新映射表时修改实体框架表达式
- d3.js - d3结合缩放和拖动调用?
- java - 在 JPA 中处理延迟初始化的最佳实践或优雅的解决方案是什么?
- reactjs - 如何确保 React 父组件在其子组件挂载之前加载数据?
- ios - textView 中的粗体/斜体样式文本输入
- sql-server - 您将如何使用字符串函数按单个术语分隔数据
- r - 有条件地执行 Rnotebook 中包含降价和内联代码块的单元格
- javascript - 克隆函数实现中“this”关键字的执行上下文