V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
zxCoder
V2EX  ›  问与答

请教一个 Python 多线程的问题

  •  
  •   zxCoder · Jun 16, 2021 · 1015 views
    This topic created in 1783 days ago, the information mentioned may be changed or developed.
    import queue
    import threading
    import time
    import uvicorn
    import schedule
    from fastapi import FastAPI
    
    task_queue = queue.Queue()
    
    app = FastAPI()
    
    
    @app.get("/")
    def read_root():
        task_queue.put(1)
        return {"Hello": "World"}
    
    
    def handle_task(task_id: str):
        pass
    
    
    def job():
        if task_queue.qsize() > 0:
            task_id = task_queue.get()
            handle_task(task_id)
    
    
    def handle_tasks():
        schedule.every(1).minute.do(job)
        while True:
            schedule.run_pending()
            time.sleep(1)
    
    if __name__ == "__main__":
        task = threading.Thread(target=handle_tasks, args=())
        task.start()
        uvicorn.run("main:app", host="0.0.0.0", port=8000)
    
    

    用的是 fastapi,然后我想用一个队列存任务序号,然后再用一个定时任务相当于轮询队列有没有任务,但是现在出错了,我发现两个线程里的队列对象不是同一个

    应该怎么写才对

    Supplement 1  ·  Jun 16, 2021

    好像不是多线程的问题,是fastapi uvicron的问题,好像变成多进程了

    2 replies    2021-06-16 21:15:33 +08:00
    ynkkdev
        1
    ynkkdev  
       Jun 16, 2021
    python 协程调用线程( https://docs.python.org/zh-cn/dev/library/asyncio-task.html#running-in-threads

    其次,你这个异步直接用协程异步算了,除非你的异步逻辑完全不支持协程的写法

    最后,那些用 fastapi,还是先把协程理解清楚了再上车吧
    zxCoder
        2
    zxCoder  
    OP
       Jun 16, 2021
    @youngce 还需要学这些吗 我是看 fastapi 写一个接口和绑定参数很快
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2690 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 02:14 · PVG 10:14 · LAX 19:14 · JFK 22:14
    ♥ Do have faith in what you're doing.