2013-02-05 17 views
7

को बाधित करने के लिए Ctrl-C को अनुमति देना मैं कुछ कम्प्यूटेशनल भारी सिमुलेशन (घर से बना) सी-आधारित पायथन एक्सटेंशन चला रहा हूं। कभी-कभी मुझे सामान गलत लगता है और एक सिमुलेशन समाप्त करना चाहते हैं। हालांकि, Ctrl-C का कोई प्रभाव नहीं पड़ता है (स्क्रीन पर ^C प्रिंट करने के अलावा मुझे kill या सिस्टम मॉनीटर का उपयोग करके प्रक्रिया को मारना है।एक पायथन सी-एक्सटेंशन

जहां तक ​​मैं पाइथन देख सकता हूं बस प्रतीक्षा करता है सी विस्तार खत्म करने के लिए और वास्तव में इस समय के दौरान तो उससे संपर्क नहीं है।

इस काम करने के लिए कोई तरीका है?

+0

देखें http://stackoverflow.com/questions/1112343/how-do-i-capture-sigint-in-python – user1929959

+0

संबंधित: [CTRL + C फोन में व्यवधान नहीं डालता करने के लिए साझा पाइथन में CTYPES का उपयोग करके लाइब्रेरी] (http://stackoverflow.com/q/14271697/4279) – jfs

उत्तर

2

मैं सी एक्सटेंशन नया स्वरूप इतना है कि वे लंबी अवधि के लिए नहीं चला होगा

तो, उन्हें अधिक प्राथमिक चरणों में विभाजित करें (प्रत्येक एक छोटी अवधि के लिए चल रहा है, उदाहरण के लिए 10 से 50 मिलीसेकंड), और पाइथन कोड द्वारा बुलाए जाने वाले इन और प्राथमिक कदम हैं।

continuation passing style को समझने के लिए प्रासंगिक हो सकता है ... एक प्रोग्रामिंग शैली के रूप में,

+3

क्षमा करें, इस मामले में बिल्कुल कोई विकल्प नहीं है :) यह एक बड़ी संख्या में कदम और गति के साथ अनुकरण आवश्यक है। प्रत्येक चरण (या यहां तक ​​कि नियमित अंतराल पर) पाइथन के साथ इंटरफेसिंग दक्षता को बर्बाद कर देगा। –

+0

कुछ मिलीसेकंड तक चलने वाली किसी चीज़ में चरणों को घुमाने का प्रयास करें। फिर पाइथन जाने का ऊपरी भाग नगण्य है ... –

+0

यह निश्चित रूप से सोचने लायक है, लेकिन यह स्मृति प्रबंधन आदि के साथ कई मुद्दों को उठाता है धन्यवाद! –

6

अजगर एक संकेत हैंडलर SIGINT पर स्थापित जो केवल एक ध्वज है कि मुख्य दुभाषिया पाश द्वारा जाँच की है सेट है। इस हैंडलर के लिए सही तरीके से काम करने के लिए, पायथन दुभाषिया को पायथन कोड चलाना होगा।

  1. उपयोग Py_BEGIN_ALLOW_THREADS/Py_END_ALLOW_THREADS अपने सी एक्सटेंशन कोड के आसपास जीआईएल जारी करने के लिए:

    आप उपलब्ध विकल्पों में से एक जोड़े को आप के लिए है। जीआईएल धारण नहीं करते समय आप किसी भी पायथन फ़ंक्शन का उपयोग नहीं कर सकते हैं, लेकिन पायथन कोड (और अन्य सी कोड) आपके सी थ्रेड (सच्चे मल्टीथ्रेडिंग) के साथ एक साथ चल सकता है। एक अलग पायथन थ्रेड सी एक्सटेंशन के साथ निष्पादित कर सकता है और Ctrl + C संकेतों को पकड़ सकता है।

  2. अपना खुद का SIGINT हैंडलर सेट करें और मूल (पायथन) सिग्नल हैंडलर को कॉल करें। आपका SIGINT हैंडलर तब भी कर सकता है जो सी एक्सटेंशन कोड को रद्द करने और पायथन दुभाषिया पर नियंत्रण वापस करने के लिए करता है।
+0

(1) [जीआईएल जारी करने से केवल तभी कोई फर्क पड़ता है जब सी एक्सटेंशन पृष्ठभूमि थ्रेड में चलता है] (http://stackoverflow.com/q/14271697/4279)। (2) [पायथन सिग्नल हैंडलर को कॉल करने के बजाय 'Py_Err_CheckSignals()' को कॉल करें] (http://stackoverflow.com/a/33652496/4279) – jfs

5

हालांकि, Ctrl-C कोई असर

Ctrl-C in the shell sends SIGINT to the foreground process group के लिए प्रतीत नहीं होता। सिग्नल प्राप्त करने पर python सी कोड में एक ध्वज सेट करता है। यदि आपका सी एक्सटेंशन मुख्य थ्रेड में चलता है तो कोई पायथन सिग्नल हैंडलर नहीं चलाया जाएगा (और इसलिए Ctrl-C पर अपवाद नहीं होगा) जब तक कि आप PyErr_CheckSignals() पर कॉल न करें जो ध्वज की जांच करता है (इसका मतलब है: यह आपको धीमा नहीं करना चाहिए) और यदि आवश्यक हो तो पाइथन सिग्नल हैंडलर चलाता है या यदि आपका सिमुलेशन पाइथन कोड निष्पादित करने की अनुमति देता है (उदाहरण के लिए, यदि सिमुलेशन पायथन कॉलबैक का उपयोग करता है)। यदि एक्सटेंशन पृष्ठभूमि थ्रेड में चलता है तो यह जीआईएल जारी करने के लिए पर्याप्त है (पाइथन कोड को मुख्य थ्रेड में चलाने की अनुमति देने के लिए जो सिग्नल हैंडलर को चलाने में सक्षम बनाता है)।

संबंधित: Cython, Python and KeybordInterrupt ingored

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