2009-11-12 16 views
27

के साथ गैर-अवरुद्ध फ़ाइल का उपयोग मैं यह पता लगाने की कोशिश कर रहा हूं कि ट्विस्ट का उपयोग करके फ़ाइल एक्सेस के लिए डिफैक्टो पैटर्न है या नहीं। मैंने देखा है कि कई उदाहरण (twisted.python.log, twisted.persisted.dirdbm, twisted.web.static) वास्तव में फ़ाइल पहुंच के लिए अवरुद्ध करने की चिंता नहीं करते हैं।ट्विस्ट

ऐसा लगता है कि कुछ स्पष्ट इंटरफ़ेस होना चाहिए, संभवतः अमूर्त से विरासत में होना चाहिए। FileDescriptor, कि सभी फ़ाइल एक्सेस को निर्माता/उपभोक्ता के रूप में जाना चाहिए।

क्या मुझे कुछ याद आया है या यह है कि एसिंक्रोनस प्रोग्रामिंग में मुड़ने के लिए प्राथमिक उपयोग नेटवर्किंग के लिए है और यह वास्तव में अन्य फाइल डिस्क्रिप्टर ऑपरेशंस के लिए काम नहीं किया गया है, नॉन-अवरुद्ध आईओ की शुद्धता के बारे में चिंता न करें?

+2

मुझे लगता है कि यह प्रश्न http://stackoverflow.com/questions/1682515/how-non-blocking-read-write-throught-remote-filesystem –

+0

का डुप्लिकेट है, प्रश्न यहां बेहतर बताया गया है। – Chris

उत्तर

-8

मुझे यकीन नहीं है कि आप क्या हासिल करना चाहते हैं। जब आप लॉगिंग करते हैं, तो पायथन सुनिश्चित करेगा (वैश्विक दुभाषिया लॉग द्वारा) जो कई धागे से संदेश लॉग करता है, एक दूसरे के बाद फ़ाइल में जाता है।

यदि आप आईओ को अवरुद्ध करने के बारे में चिंतित हैं, तो ओएस आपकी फ़ाइलों (आमतौर पर 4 केबी) के लिए डिफ़ॉल्ट बफर जोड़ता है, और आप open() कॉल में बफर आकार पास कर सकते हैं।

यदि आप किसी और चीज के बारे में चिंतित हैं, तो कृपया अपने प्रश्न को स्पष्ट करें।

+8

क्या स्पष्ट नहीं है? वह जानना चाहता है कि ट्विस्ट में अवरुद्ध किए बिना फ़ाइलों को कैसे पढ़ना/लिखना है। – truppo

14

मुझे लगता है कि आप fdesc module की तलाश में हैं। पायथन में गैर-अवरुद्ध I/O के बारे में अधिक जानकारी के लिए, आप यह video भी देख सकते हैं।

+0

@Flimm इसे फिक्स्ड। –

3

ट्विस्टेड - #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

यह फ़ाइल एक्सेस को अवरुद्ध करता है, हालांकि। यूनिक्स सिस्टम चुपचाप 'setNonBlocking' को अनदेखा करते हैं जब fd सामान्य फाइल सिस्टम फ़ाइल को इंगित करता है। –

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) 

भागो या तो की तरह मॉड्यूल एक सॉकेट या पाइप से असीमित रूप से बात करने के लिए उपयोगी हो सकता है, लेकिन जब एक एफडी दिया जाता है जो एक सामान्य फाइल सिस्टम फ़ाइल को संदर्भित करता है, तो यह आईओ को अवरुद्ध करता है (और उस पर एक अजीब इंटरफ़ेस के माध्यम से)। डिस्क io के लिए, fdesc प्रभावी रूप से सांप तेल है; इसका इस्तेमाल न करें।

मई 2017 तक, मोड़ में एसिंक डिस्क io प्राप्त करने का एकमात्र उचित तरीका deferToThread में सिंक्रोनस आईओ कॉल को लपेटकर है।

संबंधित मुद्दे