You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python集成schedule模块与Socket服务端时任务调度失效问题求助

问题原因分析

你的问题核心在于**socket.accept()是阻塞调用**——当程序执行到这一行时,会一直停在这里等待客户端连接,完全没法继续执行后面的循环逻辑。原本单独用schedule时,你的循环是每隔1秒就检查一次待执行任务;但加了Socket之后,程序大部分时间都卡在accept()上,schedule.run_pending()根本没机会定时运行,所以test1、test2这些调度任务自然不会执行。

解决方案:用多线程分离Socket监听与调度逻辑

最简单的解决方式是把Socket的服务逻辑放到单独的线程里,让主线程专门处理schedule的任务调度,这样两边互不阻塞。下面是修改后的完整代码:

import schedule
import time
import socket
import threading

def test1():
    print('hi from 1')
def test2():
    print('hi from test2')

# 定义Socket服务的线程函数
def run_socket_server():
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_address = ('localhost', 8009)
    print('starting up on {} port {}'.format(*server_address))
    sock.bind(server_address)
    sock.listen(1)
    
    while True:
        print('waiting for a connection')
        connection, client_address = sock.accept()
        try:
            data = connection.recv(1024)
            if data:
                result = data.decode('utf-8')
                print('data received from client : ', result)
                # 根据客户端指令动态添加调度任务(注意线程安全)
                with threading.Lock():
                    if result == "schedule_test1":
                        schedule.every(1).minutes.do(test1)
                    elif result == "schedule_test2":
                        schedule.every(2).minutes.do(test2)
                    # 还可以添加取消任务的逻辑,比如判断result为"cancel_test1"时移除对应任务
        finally:
            # 确保连接关闭
            connection.close()

# 启动Socket服务线程(daemon=True让线程随主线程退出)
threading.Thread(target=run_socket_server, daemon=True).start()

# 初始化默认调度任务(可选)
schedule.every(1).minutes.do(test1)
schedule.every(2).minutes.do(test2)

# 主线程专门处理调度任务检查
while True:
    schedule.run_pending()
    time.sleep(1)
关键细节说明
  1. 线程分离:把阻塞的Socket监听放到后台线程,主线程只负责每隔1秒检查并执行待调度任务,两边的逻辑不会互相卡住。
  2. 线程安全:schedule模块的API不是线程安全的,如果要在Socket线程里动态添加/修改任务,一定要用threading.Lock()加锁,避免多线程操作导致的异常。
  3. 连接关闭:在处理完客户端请求后,要确保关闭连接,避免资源泄漏。

如果不想用多线程,也可以考虑用非阻塞Socket结合select模块来同时处理IO事件和定时任务,但多线程的实现方式更直观,适合快速解决问题。

内容的提问来源于stack exchange,提问作者FaizanSyed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 22:32:51