मुझे पाइथन में धागे और टेम्पफाइल मॉड्यूल के साथ एक दिलचस्प समस्या है। धागे से बाहर निकलने तक कुछ साफ नहीं हो रहा है, और मैं एक खुली फ़ाइल सीमा के खिलाफ चल रहा हूं। (यह ओएस एक्स 10.5.8, पायथन 2.5.1 पर है।)पायथन tempfile मॉड्यूल और धागे अच्छा खेल नहीं रहे हैं; मैं क्या गलत कर रहा हूं?
फिर भी अगर मैं दोहराना चाहता हूं कि tempfile मॉड्यूल क्या कर रहा है (सभी सुरक्षा जांच नहीं, बल्कि सिर्फ फाइल डिस्क्रिप्टर उत्पन्न करना और फिर ओएस का उपयोग करना। फ़ाइल ऑब्जेक्ट बनाने के लिए fdopen) मुझे कोई समस्या नहीं है।
इसे पायथन के साथ एक बग के रूप में दर्ज करने से पहले, मुझे लगा कि मैं यहां जांच करूंगा, क्योंकि यह बहुत अधिक संभावना है कि मैं कुछ गलत कर रहा हूं। लेकिन अगर मैं हूं, तो इसे समझने की कोशिश करने का एक दिन मुझे कहीं भी नहीं मिला है।
#!/usr/bin/python
import threading
import thread
import tempfile
import os
import time
import sys
NUM_THREADS = 10000
def worker_tempfile():
tempfd, tempfn = tempfile.mkstemp()
tempobj = os.fdopen(tempfd, 'wb')
tempobj.write('hello, world')
tempobj.close()
os.remove(tempfn)
time.sleep(10)
def worker_notempfile(index):
tempfn = str(index) + '.txt'
# The values I'm passing os.open may be different than tempfile.mkstemp
# uses, but it works this way as does using the open() function to create
# a file object directly.
tempfd = os.open(tempfn,
os.O_EXCL | os.O_CREAT | os.O_TRUNC | os.O_RDWR)
tempobj = os.fdopen(tempfd, 'wb')
tempobj.write('hello, world')
tempobj.close()
os.remove(tempfn)
time.sleep(10)
def main():
for count in range(NUM_THREADS):
if count % 100 == 0:
print('Opening thread %s' % count)
wthread = threading.Thread(target=worker_tempfile)
#wthread = threading.Thread(target=worker_notempfile, args=(count,))
started = False
while not started:
try:
wthread.start()
started = True
except thread.error:
print('failed starting thread %s; sleeping' % count)
time.sleep(3)
if __name__ == '__main__':
main()
अगर मैं worker_notempfile
लाइन सक्रिय और worker_tempfile
लाइन टिप्पणी की-आउट के साथ इसे चलाने के लिए, यह पूरा करने चलाता है।
दूसरी तरह के आसपास (worker_tempfile
उपयोग करते हुए) मैं निम्न त्रुटि हो:
$ python threadtempfiletest.py
Opening thread 0
Opening thread 100
Opening thread 200
Opening thread 300
Exception in thread Thread-301:
Traceback (most recent call last):
File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/threading.py", line 460, in __bootstrap
File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/threading.py", line 440, in run
File "threadtempfiletest.py", line 17, in worker_tempfile
File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/tempfile.py", line 302, in mkstemp
File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/tempfile.py", line 236, in _mkstemp_inner
OSError: [Errno 24] Too many open files: '/var/folders/4L/4LtD6bCvEoipksvnAcJ2Ok+++Tk/-Tmp-/tmpJ6wjV0'
कोई भी विचार क्या मैं गलत कर रहा हूँ? क्या यह पाइथन में एक बग है, या क्या मैं हड्डी का नेतृत्व कर रहा हूं?
अद्यतन 2009-12-14: मुझे लगता है कि मुझे जवाब मिल गया है, लेकिन मुझे यह पसंद नहीं है। चूंकि कोई भी समस्या को दोहराने में सक्षम नहीं था, इसलिए मैं मशीनों के लिए हमारे कार्यालय के चारों ओर शिकार कर रहा था। यह मेरी मशीन को छोड़कर सब कुछ पर पारित किया। मैंने मैक पर उसी सॉफ़्टवेयर संस्करणों का परीक्षण किया था जिसका उपयोग मैं कर रहा था। मैं भी एक ही हार्डवेयर और सॉफ्टवेयर कॉन्फ़िगरेशन के साथ एक डेस्कटॉप जी 5 के लिए शिकार चला गया - एक ही परिणाम। दोनों परीक्षण (tempfile और tempfile के साथ) सब कुछ पर सफल रहा।
किक्स के लिए, मैंने पायथन 2.6.4 डाउनलोड किया, और इसे अपने डेस्कटॉप पर और पायथन 2.5.1 के रूप में मेरे सिस्टम पर एक ही पैटर्न की कोशिश की: tempfile विफल रहा, और notempfile सफल हुआ।
यह मुझे इस निष्कर्ष पर पहुंचा रहा है कि मेरे मैक पर कुछ हुआ है, लेकिन मुझे यकीन है कि क्या पता नहीं लगा सकता। किसी भी सुझाव का स्वागत है।
मदद नहीं कर सकता, लेकिन अच्छे कोड के साथ स्पष्ट प्रश्न के लिए +1। –
क्या आप हमें पाइथन संस्करण दे सकते हैं, कृपया? मुझे नहीं पता कि यह मायने रखता है, लेकिन यह हो सकता है। –
जोनाथन: बहुत बहुत धन्यवाद! पीटर: पायथन 2.5.1। मैंने इसे प्रतिबिंबित करने के लिए प्रश्न भी संपादित किया है। – Schof