开发者社区> 问答> 正文

如何在一个服务中创建多个client?

以服务的形式接收在钉钉中和机器人对话的消息. 如果我创建了多个机器人, 我在代码中该如何启动多个服务来接收消息?
我有如下代码:

def client(app_key, app_secret):
    credential = dingtalk_stream.Credential(app_key, app_secret)
    client = dingtalk_stream.DingTalkStreamClient(credential)
    client.register_all_event_handler(MyEventHandler())
    client.register_callback_handler(dingtalk_stream.ChatbotMessage.TOPIC, MyCallbackHandler())
    client.start_forever()

如果我想创建多个client并且同时运行, 我该怎么做?

现在是我使用多线程创建多个client,代码如下:

def main():
    threads = []
    thread1 = threading.Thread(target=client, args=(
        "xxx", "xxx"))
    thread2 = threading.Thread(target=client, args=(
        "xxx", "xxx"))
    threads.append(thread1)
    threads.append(thread2)
    for thread in threads:
        thread.start()

报错:RuntimeError: cannot schedule new futures after interpreter shutdown

展开
收起
游客tkln6n4uvhmoe 2024-07-11 10:00:25 31 0
1 条回答
写回答
取消 提交回答
  • 北京阿里云ACE会长

    多线程 问题

    避免使用全局解释器锁(GIL):
    如果你的程序是 CPU 密集型的,使用多线程可能不是最佳选择,因为 Python 的 GIL 会限制多线程的并行执行。

    使用线程池的示例代码:

    import threading
    from concurrent.futures import ThreadPoolExecutor
    import time
    
    def client(app_key, app_secret):
        credential = dingtalk_stream.Credential(app_key, app_secret)
        client = dingtalk_stream.DingTalkStreamClient(credential)
        client.register_all_event_handler(MyEventHandler())
        client.register_callback_handler(dingtalk_stream.ChatbotMessage.TOPIC, MyCallbackHandler())
        client.start_forever()
    
    def main():
        with ThreadPoolExecutor(max_workers=2) as executor:
            futures = [
                executor.submit(client, "xxx", "xxx"),
                executor.submit(client, "yyy", "yyy")
            ]
            # 等待所有线程完成
            for future in futures:
                future.result()
    
    if __name__ == "__main__":
        main()
    
    2024-07-13 17:09:12
    赞同 7 展开评论 打赏
问答分类:
来源圈子
更多
收录在圈子:
+ 订阅
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载