Twisted的非阻塞文件访问

2024-05-12 02:43:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我想弄清楚使用twisted访问文件是否有一个事实上的模式。我看过的很多例子(twisted.python.log、twisted.persistend.dirdbm、twisted.web.static)似乎并不担心文件访问的阻塞。

似乎应该有一些明显的接口,可能继承自abstract.FileDescriptor,所有文件访问都应该作为生产者/消费者通过它。

我是否遗漏了一些东西,或者仅仅是twisted在异步编程中的主要用途是用于网络,而其他文件描述符操作并没有真正解决这个问题,而不是担心非阻塞IO的纯度?


Tags: 文件abstractlogweb编程模式twisted消费者
3条回答

Twisted-#3983中有一张这方面的公开票。

经过大量的搜索、尝试和错误之后,我终于想出了如何使用^{}

from __future__ import print_function

from twisted.internet.task import react
from twisted.internet import stdio, protocol
from twisted.internet.defer import Deferred
from twisted.internet.fdesc import readFromFD, setNonBlocking


class FileReader(protocol.Protocol):
    def __init__(self, filename):
        self.f = open(filename, 'rb')

    def dataReceived(self, data):
        self.transport.write(data)

    def connectionMade(self):
        fd = self.f.fileno()
        setNonBlocking(fd)
        readFromFD(fd, self.dataReceived)

    def connectionLost(self, reason):
        self.f.close()

def main(reactor, filename):
    stdio.StandardIO(FileReader(filename))

[编辑:我也找到了一种不需要使用协议的简单方法]

def getFile(filename):
    with open(filename) as f:
        d = Deferred()
        fd = f.fileno()
        setNonBlocking(fd)
        readFromFD(fd, d.callback)
        return d


def main(reactor, filename):
    d = getFile(filename)
    return d.addCallback(print)

要么像这样跑:

react(main, ['/path/to/file'])

我想你在找fdesc module。有关Python中的非阻塞I/O的更多信息,您还可以查看这个video

相关问题 更多 >