Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Twisted中写入文件(阻止IO操作)的更好方法_Python_Twisted - Fatal编程技术网

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

Python 在Twisted中写入文件(阻止IO操作)的更好方法,python,twisted,Python,Twisted,我听说我们应该避免在Twisted框架中执行IO阻塞操作 但是,如果我必须将接收到的数据导出到外部txt文件,该怎么办 现在我用这种方式编写代码 有没有更好的解决办法?谢谢 class BeginningPrinter(Protocol): def __init__(self, finished): self.finished = finished self.counter = 0 def dataReceived(self, bytes):

我听说我们应该避免在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)

在Twisted中应避免阻塞文件I/O,原因与避免任何阻塞操作大致相同。任何一个线程一次只能做一件事。如果该线程是reactor线程,并且您让它做的事情是阻塞要完成的操作,那么在该操作完成之前,您分配给reactor的任何其他工作都不会取得进展。这会导致资源利用率低下和应用程序无响应

当您的程序在网络I/O上阻塞时,这尤其有问题,因为网络速度很慢。甚至比速度慢更糟糕的是,网络另一端的程序通常不能指望特别合作。它可能会故意放慢速度,特别是如果它的操作员知道这将对您的软件产生负面影响

磁盘I/O与此略有不同。与网络相比,磁盘通常速度快(本地网络可能比磁盘快,但磁盘可能比公共internet上的随机连接快)。磁盘通常也不是恶意的(它们不会尽可能慢地为您的请求提供服务)。正因为如此,许多使用扭曲的文件系统操作编写的程序“足够快”,而忽略了技术上它们是使用阻塞I/O < /P>来完成的。 在某些特殊情况下,您可能希望选择另一条路线。对于我开发的一个应用程序,预期的情况是磁盘带宽几乎一直被运行在同一台机器上的其他软件完全使用。这通常会导致Twisted进程中的简单文件系统操作花费数百或数千毫秒,从而导致无法接受的性能下降。在本例中,我们选择将文件系统操作移动到第二个进程,并使用在UNIX套接字上运行的简单协议驱动它们

由于使用了这些工具,因此走这条路线会带来不小的额外开发成本。您应该考虑您的应用程序是否实际遭受1ms或2ms等待时间(或者考虑到SSDS的上升而降低)。在大多数正常情况下阻塞磁盘I/O,或者在决定采取哪种路由之前,您的软件是否需要在异常磁盘负载的情况下正常运行,都会导致错误