• 这些基本的东西,你得会用啊

  • 20W 就分表吗?“卡”的原因有很多,你先找个工具,分析一下,瓶颈出在哪里。

  • Rails JSON logger at 2024年03月04日

    又是从哪里拷贝翻译的?

  • 为什么会翻译为"宝石"?

  • 阶段四:IO 线程回写 Socket 和主线程清空全局队
    
    主线程执行完请求操作后,会把需要返回的结果写入缓冲区。然后,主线程会阻塞等待 IO 线程把这些结果回写到 Socket 中,并返回给客户端。
    

    主线程为啥要阻塞等待 IO 线程呢?为啥不去做其他的事情?主线程要是阻塞等待 IO 线程,为啥不直接自己操作 IO 算了?这样不还是同一时间,只有一个线程在工作吗?

  • import asyncio
    import time
    
    async def say_after(delay, what):
        print(f'[%s]: starting %s' % (time.time(), what))
        await asyncio.sleep(delay)
        print(f'[%s]: ending %s' % (time.time(), what))
    
    
    async def main():
        task1 = asyncio.create_task(
            say_after(1, 'hello'))
    
        task2 = asyncio.create_task(
            say_after(2, 'world'))
    
        task3 = asyncio.create_task(
            say_after(0.5, 'Hai')
        )
    
        print(f"started at {time.strftime('%X')}")
    
        # Wait until both tasks are completed (should take
        # around 2 seconds.)
        await task1
        # await task2
    
        print(f"finished at {time.strftime('%X')}")
    
    
    if __name__ == '__main__':
        asyncio.run(main())
    
    
    started at 11:49:41
    [1691380181.884058]: starting hello
    [1691380181.884095]: starting world
    [1691380181.884105]: starting Hai
    [1691380182.385623]: ending Hai
    [1691380182.885086]: ending hello
    finished at 11:49:42
    

    create_task 会顺序把三个任务放入队列。 await 相当于一把发令枪,trigger 一下,三个任务顺序开始执行。

    如果此时,在 await task1 之后,再 sleep 一下,就能看到执行时间最长的那个任务也结束了。

    import asyncio
    import time
    
    async def say_after(delay, what):
        print(f'[%s]: starting %s' % (time.time(), what))
        await asyncio.sleep(delay)
        print(f'[%s]: ending %s' % (time.time(), what))
    
    
    async def main():
        task1 = asyncio.create_task(
            say_after(1, 'hello'))
    
        task2 = asyncio.create_task(
            say_after(2, 'world'))
    
        task3 = asyncio.create_task(
            say_after(0.5, 'Hai')
        )
    
        print(f"started at {time.strftime('%X')}")
    
        # Wait until both tasks are completed (should take
        # around 2 seconds.)
        await task1
        # await task2
    
        await asyncio.sleep(2)
    
        print(f"finished at {time.strftime('%X')}")
    
    
    if __name__ == '__main__':
        asyncio.run(main())
    
    
    started at 11:56:07
    [1691380567.491296]: starting hello
    [1691380567.491312]: starting world
    [1691380567.491318]: starting Hai
    [1691380567.992693]: ending Hai
    [1691380568.4926028]: ending hello
    [1691380569.492554]: ending world
    finished at 11:56:10
    

    应该把这里的 create_task, await 比作 socket 中的 writeflush 操作来理解,或者写日志中的 writeflush 操作。