2009-11-12 6 views
27

트위스트를 사용하여 파일 액세스에 대한 패턴이 있는지 알아 내려고하고 있습니다. 내가 본 (twisted.python.log, twisted.persisted.dirdbm, twisted.web.static) 예제는 실제로 파일 액세스를 차단하는 것에 대해 걱정하지 않는 것 같습니다.트위스티드로 비 차단 파일 액세스

명백한 인터페이스가 있어야하며, 아마도 abstract.FileDescriptor를 상속 받아야하는 것처럼 보입니다. 모든 파일 액세스는 제작자/소비자로서 진행되어야합니다.

뭔가를 놓친 적이 있습니까? 아니면 비동기 프로그래밍의 비틀림에 대한 주된 용도가 네트워킹을위한 것이고 비 차단 IO의 순도에 대해 걱정하지 않고 다른 파일 설명자 작업에 실제로 적용되지 않았습니까?

+2

이 질문은 http://stackoverflow.com/questions/1682515/how-non-blocking-read-write-throught-remote-filesystem의 중복이라고 생각합니다. –

+0

질문은 여기에 더 잘 설명되어 있습니다. – Chris

답변

-8

달성하고자하는 것이 확실하지 않습니다. 로깅을하면 파이썬은 여러 인터프리터 로그를 통해 여러 스레드의 로그 메시지가 하나씩 차례대로 파일에 저장되도록합니다.

IO를 차단하는 것이 우려된다면 OS는 파일 (보통 4KB)에 대한 기본 버퍼를 추가하고 open() 호출에서 버퍼 크기를 전달할 수 있습니다.

다른 문제가 염려되는 경우 질문을 명확히하십시오.

+8

명확하지 않은 점은 무엇입니까? Twisted에서 블로킹하지 않고 파일을 읽고 쓰는 방법을 알고 싶습니다. – truppo

14

나는 fdesc module을 찾고 있다고 생각합니다. 파이썬에서 논 블로킹 I/O에 대한 자세한 내용은 video을 참조하십시오.

+0

@Flimm 고쳐졌습니다. –

3

Twisted - #3983에 공개 티켓이 있습니다.

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)) 

[편집 : 나는 또한 단지 프로토콜의 사용을 필요로하지 않는 간단한 방법 알아 냈] :

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

두 번째 예에서 지연이 발생하지 않은 상태에서 파일을 닫으면 문제가 발생합니까? – Chris

+0

좋은 지적 @ 크리스. 컨텍스트 관리자를 용서하고 콜백에서 파일을 명시 적으로 닫는 것이 더 나을 수도 있습니다. – reubano

+0

이것은 파일 액세스를 차단합니다. 유닉스 시스템은 fd가 일반 파일 시스템 파일을 가리킬 때 자동으로'setNonBlocking'을 무시합니다. –

1

fdesc

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) 

실행 중과 같이를 모듈은 비동기 적으로 소켓이나 파이프와 통신하는 데 유용 할 수 있지만 일반적인 파일 시스템 파일을 참조하는 fd가 주어지면 io (그리고 그보다 약간 이상한 인터페이스를 통해)를 차단합니다. 디스크 io의 경우 fdesc는 효과적으로 뱀 기름입니다. 그것을 사용하지 마십시오.

2017 년 5 월 현재 비동기 디스크 IO를 꼬인 상태로 만드는 유일한 방법은 동기식 io 호출을 deferToThread으로 래핑하는 것입니다.