2011-12-27 8 views
6

निम्नलिखित कोड अनिवार्य रूप से बिल्लियों() select.select के साथ एक फ़ाइल:डिस्क फ़ाइलों के साथ select.select() क्यों काम करता है लेकिन epoll() नहीं?

f = open('node.py') 
fd = f.fileno() 
while True: 
    r, w, e = select.select([fd], [], []) 
    print '>', repr(os.read(fd, 10)) 
    time.sleep(1) 

जब मैं epoll के साथ एक समान बात की कोशिश मैं एक त्रुटि मिलती है:

self._impl.register(fd, events | self.ERROR) 
IOError: [Errno 1] Operation not permitted 

मैं भी कि epoll पढ़ा है डिस्क फ़ाइलों का समर्थन नहीं करता है - या शायद यह समझ में नहीं आता है।

Epoll on regular files

लेकिन क्यों चुनें() समर्थन डिस्क फाइल तो करता है? मैंने selectmodule.c में कार्यान्वयन को देखा और ऐसा लगता है कि यह ऑपरेटिंग सिस्टम के माध्यम से जा रहा है, यानी पायथन कोई विशेष समर्थन नहीं जोड़ रहा है।

उच्च स्तर पर मैं एक गैर-ब्लॉकिंग सर्वर में स्थिर फ़ाइलों को प्रस्तुत करने के सर्वोत्तम तरीके से प्रयोग कर रहा हूं। मुझे लगता है कि मैं I/O धागे बनाने की कोशिश करूंगा जो डिस्क और फ़ीड डेटा से मुख्य घटना लूप थ्रेड पर पढ़ते हैं जो सॉकेट को लिखता है।

उत्तर

7

चयन करने के लिए नियमित फ़ाइलों को इंगित करने वाले दायरलेखकों को अनुमति देता है, हालांकि यह हमेशा एक फ़ाइल को पठनीय/लिखने योग्य (जैसे यह कुछ बेकार है, क्योंकि यह आपको नहीं बताता है कि एक पढ़/लिखना वास्तव में अवरुद्ध होगा)।

epoll बस नियमित फ़ाइलों की निगरानी की अनुमति नहीं देता है, क्योंकि यह कोई तंत्र है (linux पर कम से कम) उपलब्ध बताने के लिए पढ़ने/ब्लॉक कर देगा एक नियमित रूप से फ़ाइल लेखन है कि क्या

+0

आह ठीक है, तो मेरे os.read() में फोन चयन लूप तब अवरुद्ध है। समझ में आता है। –

+0

@ user1117755 हां, अगर यह हार्ड ड्राइव की प्रतीक्षा कर रहा है तो यह अवरुद्ध हो रहा है। – nos

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