• 用户密码只是安全的一部分,其他信息就不重要了吗?例如,手机号,年龄,性别,订单,支付信息等等... 为什么这些信息不需要加密呢?如果要加密,那就是把 HTTPS 重新实现了一遍。不要搞“局部优化”。

  • 当前页码数字没有展示 at 2024年07月16日

    a 标签中都有 remote 属性了?前端发展的太快了。

  • 怎么和 捧哏 逗哏 一样呢

  • 某些前端童鞋非要让 js 做后端的事情... 能把前端做好就谢天谢地了

  • 分布式锁 at 2024年05月22日

    看你怎么用。把 synchronized 锁包在外面,分布式锁放在里面。synchronized 锁就把大部分请求以很廉价的方式拦下来了,不用请求分布式锁,这个比较“昂贵”(通信开销之类的)。

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

  • 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 操作。