2015-12-06 8 views
48

मैंने this question से बहुत अधिक मेमोरी का उपयोग करने वाली प्रक्रिया को मारने से पहले पूछा है, और मुझे सबसे अधिक समाधान मिल गया है।एक बहुत बड़ी संख्या की गणना करने की कोशिश करते समय पाइथन "preemptively" क्यों लटका है?

हालांकि, एक समस्या है: बड़ी संख्या की गणना करने के तरीके को मैं जिस विधि का उपयोग करने की कोशिश कर रहा हूं उससे छूटा हुआ प्रतीत होता है। नीचे दिया गया यह कोड प्रक्रिया पर 10 सेकंड CPU समय सीमा डालने का इरादा है।

-1 -1 
ran out of time! 

इसके बजाय मैं कोई उत्पादन मिलता है,:

import resource 
import os 
import signal 

def timeRanOut(n, stack): 
    raise SystemExit('ran out of time!') 
signal.signal(signal.SIGXCPU, timeRanOut) 

soft,hard = resource.getrlimit(resource.RLIMIT_CPU) 
print(soft,hard) 
resource.setrlimit(resource.RLIMIT_CPU, (10, 100)) 

y = 10**(10**10) 

क्या मैं जब मैं इस स्क्रिप्ट (एक यूनिक्स मशीन पर) चलाने देखने की उम्मीद यह है। एक ही रास्ता मैं आउटपुट प्राप्त Ctrl +सी के साथ है, और मैं इस मिल अगर मैं Ctrl +सी के बाद 10 सेकंड:

^C-1 -1 
ran out of time! 
CPU time limit exceeded 

अगर मैं Ctrl +सी 10 सेकंड से पहले, मुझे इसे दो बार करना होगा, और कंसोल आउटपुट इस तरह दिखता है:

^C-1 -1 
^CTraceback (most recent call last): 
    File "procLimitTest.py", line 18, in <module> 
    y = 10**(10**10) 
KeyboardInterrupt 

प्रयोग करने और इसे समझने की कोशिश करने के दौरान, मैंने प्रिंट और बड़ी संख्या गणना के बीच time.sleep(2) भी लगाया है। ऐसा कोई प्रभाव नहीं प्रतीत होता है। अगर मैं y = 10**10 करने के लिए y = 10**(10**10) बदलने के लिए, तो प्रिंट और नींद बयान अपेक्षित तरीके से। प्रिंट बयान के बाद प्रिंट बयान के flush=True या sys.stdout.flush() जोड़ा जा रहा है या तो काम नहीं करते।

मैं बहुत बड़ी संख्या की गणना के लिए CPU समय को सीमित क्यों नहीं कर सकता? मैं इसे कैसे ठीक कर सकता हूं या कम से कम इसे कम कर सकता हूं?


अतिरिक्त जानकारी:

अजगर संस्करण: 3.3.5 (default, Jul 22 2014, 18:16:02) \n[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)]

लिनक्स जानकारी: Linux web455.webfaction.com 2.6.32-431.29.2.el6.x86_64 #1 SMP Tue Sep 9 21:36:05 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

+3

मैं 3.4.3 पर पुन: पेश कर सकता हूं लेकिन 2.7.9 नहीं। यह डरावना है। – senshin

+0

हम्म ... मुझे हमेशा 'SystemError मिलता है: PyEval_EvalFrameEx ने एक त्रुटि सेट के साथ परिणाम लौटाया' जो कि मेरे 'आर्क लिनक्स 4.2.5-1-ARCH' पर पाइथन 3.5 का उपयोग करके 10 सेकंड के पहले या बाद में था। और यदि मैं पाइथन 2.7 कोड चलाता हूं, तो यह आपके उम्मीद आउटपुट के रूप में ठीक काम करता है। –

+2

मैं * अनुमान लगा रहा हूं * कि पाइथन पहले स्थिरांक की गणना करके अनुकूलित करने की कोशिश कर रहा है ... जो बैकफायर करता है। लेकिन मेरे पास इसका कोई सबूत नहीं है। –

उत्तर

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