27

ツイストを使用したファイルアクセスの事実上のパターンがあるかどうかを把握しようとしています。私が見た多くの例 (twisted.python.log、twisted.persisted.dirdbm、twisted.web.static) では、実際にはファイル アクセスのブロックについて心配していないようです。

おそらくabstract.FileDescriptorから継承し、すべてのファイルアクセスがプロデューサー/コンシューマーとして通過する必要がある、明らかなインターフェースが必要なようです。

私は何かを見逃していましたか、それとも非同期プログラミングでのツイストの主な用途はネットワーキングであり、非ブロック IO の純度を心配せずに、他のファイル記述子操作については実際には解決されていませんか?

4

5 に答える 5

14

fdesc モジュールを探していると思います。Python でのノンブロッキング I/O の詳細については、こちらのビデオもご覧ください。

于 2010-03-15T21:08:59.043 に答える
3

Twisted - #3983には、これに対するオープンチケットがあります。

于 2010-03-30T21:16:37.897 に答える
2

いろいろ探して、試行錯誤して、やっと使い方がわかりましたfdesc

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'])
于 2015-11-14T13:32:07.173 に答える
-8

あなたが何を達成したいのかわかりません。ロギングを行うと、Python は (グローバル インタープリター ログによって) 複数のスレッドからのログ メッセージが次々にファイルに書き込まれることを確認します。

IO のブロックが心配な場合は、OS がファイルの既定のバッファー (通常は 4KB) を追加し、open()呼び出しでバッファー サイズを渡すことができます。

他に気になることがあれば、質問を明確にしてください。

于 2009-11-12T08:54:17.923 に答える