我正在尝试构建一个示例Python脚本,以便了解自己如何使用python 3.5中的select.poll()一次异步写入多个文件,并将性能与同步版本进行比较。 我在BSD系统上测试它。
然而,似乎我仍然在同步这样做,我无法看到我在哪里犯错,或者如何调试脚本。
到目前为止我的代码
import os
import fcntl
import select
poll = select.poll()
big_text = open('big-text.txt', 'r').read()
files_data = {}
for i in range(FILES_NO):
file_name = 'data/file_{}'.format(i)
fd = open(file_name, 'w')
fcntl.fcntl(fd, fcntl.F_SETFL | os.O_NONBLOCK)
files_data[fd.fileno()] = {}
files_data[fd.fileno()]['fd'] = fd
files_data[fd.fileno()]['bytes_wrote'] = 0
files_data[fd.fileno()]['filename'] = file_name
poll.register(fd)
def write(files_data, fileno, text):
files_data[fileno]['fd'].write(text)
files_data[fileno]['bytes_wrote'] += len(text)
chunk_size = 8192
while True:
polled = poll.poll(0)
if not polled:
break
for fileno, flags in polled:
if flags & select.POLLOUT:
bytes_wrote = files_data[fileno]['bytes_wrote']
file_name = files_data[fileno]['filename']
next_chunk = big_text[bytes_wrote:bytes_wrote + chunk_size]
write(files_data, fileno, next_chunk)
if len(next_chunk) == 0:
poll.unregister(fileno)
有什么想法吗?