在Twisted中写入文件(阻止IO操作)的更好方法

时间:2014-06-04 09:12:16

标签: python twisted

我听说我们应该避免在Twisted框架中进行IO阻塞操作,

但是我必须将收到的数据导出到外部txt文件

现在我以这种方式编写代码,

有没有更好的解决方案?感谢

class BeginningPrinter(Protocol):
    def __init__(self, finished):
        self.finished = finished
        self.counter = 0

    def dataReceived(self, bytes):        
            self.counter += 1
            f = open('export.txt', 'a')
            f.write(bytes)

1 个答案:

答案 0 :(得分:7)

在Twisted中应该避免阻塞文件I / O,原因与避免任何阻塞操作相同。任何一个线程一次只能做一件事。如果该线程是反应器线程,并且你所做的事情就是阻塞一个操作完成,那么你所分配给反应堆的其他任何工作都不会在该操作完成之前取得进展。这导致资源使用不当和应用程序无响应。

当程序在网络I / O上阻塞因为网络很慢时,这尤其成问题。更糟糕的是,通常情况下,网络另一端的程序不能依赖于特别合作。它可能会故意缓慢进行,特别是如果操作员了解这会对您的软件产生负面影响。

磁盘I / O与此略有不同。与网络相比,磁盘通常很快(您的本地网络可能比您的磁盘更快,但您的磁盘可能比通过公共互联网的随机连接更快)。磁盘通常也不是恶意的(它们不会尽可能慢地为您的请求提供服务)。因此,许多使用Twisted编写的程序认为文件系统操作足够快"并且忽视了技术上他们使用阻塞I / O完成的事实。

在特殊情况下,您可能想要转向另一条路线。对于我曾经研究过的一个应用程序,预期的情况是磁盘带宽在同一台机器上运行的其他软件几乎全部几乎完全被使用。这通常导致在使用Twisted的过程中的简单文件系统操作花费数百或数千毫秒,这导致不可接受的性能降级。在这种情况下,我们选择将文件系统操作移动到第二个进程,并使用在UNIX套接字上运行的简单协议来驱动它们。

由于asynchronous filesystem operations are quite primitive的工具,走这条路线会产生非常重要的额外开发成本。你应该考虑你的应用程序是否真的会受到1毫秒或2毫秒的等待时间(或者更低,因为SSD的增加),它会在大多数正常情况下阻塞磁盘I / O,或者你的软件是否需要运行在决定采用哪条路线之前,在特殊磁盘负载情况下。