我对于javascript中的事件驱动机制非常好奇。如果使用javascript异步读取文件,可以使用如下代码:
var fs = require('fs');
// 打开一个流:
var rs = fs.createReadStream('sample.txt', 'utf-8');
rs.on('data', function (chunk) {
    console.log('DATA:')
    console.log(chunk);
});
rs.on('end', function () {
    console.log('END');
});
rs.on('error', function (err) {
    console.log('ERROR: ' + err);
});
而如果使用python则代码会是这样:
try:
    f = open('/path/to/file', 'r')
    print(f.read())
finally:
    if f:
        f.close()
我自己尝试使用python模拟javascript的写法(不一定是异步,只是想模仿这种风格),但是失败了,运行 fs_test.py 没有任何输出。 自己的代码如下:
events.py
class EventEmitter():
    events_dict = {}
    # "on" function
    def on(self, event, event_handler):
        if self.events_dict.get(event) == None:
            self.events_dict[event] = [event_handler]
        elif not event_handler in self.events_dict[event]:
            self.events_dict[event].append(event_handler)
    # "emit" function
    def emit(self, event):
        if self.events_dict.get(event) == None:
            pass
        else:
            for event_handler in self.events_dict[event]:
                event_handler(event)    
    def get_event_handler_length(self, event):
        return len(self.events_dict.get(event))
fs.py
from events import EventEmitter
def createReadStream(srcFile, code):
    emitter = EventEmitter()
    try :
        f = open(srcFile, 'r', encoding=code)
        data = f.read()
        emitter.emit('data')
        emitter.emit('end')
    except Exception:
        emitter.emit('error')
    return emitter
fs_test.py
import fs
rs = fs.createReadStream('sample.txt', 'utf-8')
def data(chunk):
    print('DATA:')
    print(chunk)
def end():
    print('END')
def error(error):
    print('ERROR: ' + error)
rs.on('data', data)
rs.on('end', end)
rs.on('error', error)
我找了很长时间,没有发现网上有类似的资源。我了解到python有asyncio以及twister等库可以使用,但是现在我并不想真正让其异步,只是单纯想使用python模拟javascript的这种编码风格而已。请问我应该怎么做?
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
如果只要求风格相近的话,有一个折衷的办法:先绑定再执行
events.py
fs.py
test.py
createReadStream里面执行emitter.emit的时候,events_dict里面是空的,create完才通过on方法注册了event_handler,顺序完全反了。。最后还是加入了多线程来尝试解决这个问题:
fs.py不过很明显,代码非常难看。全局变量、
event_handler参数的处理等都非常不满意。python的协程、asyncio等机制个人还没有理解,不会用,还是深入研究javascript以及python之后再来考虑这个问题吧。javascript的异步是纤程异步,python的异步是并发异步。
javascript的异步来自libuv,如果你想用python模拟,起码先要找到libuv或同类的包装库吧。