待优化场景和现象
项目给予flask gevent框架, 会周期性的(5秒)向文件系统写一个json文件
这个文件大小为40M
现象是,进程每次在写文件到写完文件之间,gevent不会切换执行其他协程的代码,直到文件写完毕
原理
linux对于文件的读写,都会阻塞写文件的线程(不论文件的fd被设成blocking或non-blocking)
因为对于文件来说,io一直是ready的,所以线程会一直调用write写,不像网络io一样是可以异步检测ready状态(这句话如果不正确,请大家指正)
如果项目是单线程的程序,用gevent的协程来实现并行,gevent的某个协程一旦写文件,整个进程的单线程就会被阻塞,也就不会给gevent调度协程的机会,于是,所有协程都会卡住
测试
# coding=utf-8
from gevent.monkey import patch_all
patch_all()
import gevent
import json
import os
import sys
import redis
AMOUNT = 300000
OUTPUT_FILE = 'test.json'
r = redis.Redis(host='127.0.0.1', port=6379, decode_responses=True)
dict = {}
# 生成大json
def generate_dic