6

मैं सिर्फ अपने समवर्ती वायदा मॉड्यूल के परिणामस्वरूप python3 पर चले गए है। मैं सोच रहा था कि क्या मैं त्रुटियों का पता लगाने के लिए इसे प्राप्त कर सकता हूं। मैं, समानांतर कार्यक्रम को समवर्ती वायदा उपयोग करना चाहते हैं वहाँ और अधिक कुशल मॉड्यूल तो कृपया मुझे पता है।कैसे python3 में concurrent.futures में अपवाद का पता लगाने के लिए?

मैं के रूप में यह बहुत ही जटिल है और बहुत ज्यादा नहीं प्रलेखन बाहर है बहु पसंद नहीं है। यह बहुत अच्छा है लेकिन अगर किसी को केवल बहु का उपयोग कर गणना समानांतर इतना है कि यह समझने में आसान है कार्यों वर्गों के बिना एक नमस्ते विश्व लिख सकता होगा।

from concurrent.futures import ThreadPoolExecutor 

def pri(): 
    print("Hello World!!!") 

def start(): 
    try: 
     while True: 
      pri() 
    except KeyBoardInterrupt: 
     print("YOU PRESSED CTRL+C") 


with ThreadPoolExecutor(max_workers=3) as exe: 
    exe.submit(start) 

ऊपर कोड था सिर्फ एक डेमो, कैसे CTRL + C satement मुद्रित करने के लिए काम नहीं करेगा की:

यहाँ एक सरल स्क्रिप्ट है।

मैं क्या चाहता हूँ एक समारोह कॉल करने के लिए सक्षम होने के लिए है एक त्रुटि मौजूद है। यह त्रुटि पहचान फ़ंक्शन से ही होनी चाहिए।

एक और उदाहरण

import socket 
from concurrent.futures import ThreadPoolExecutor 
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 
def con(): 
    try: 
     s.connect((x,y)) 
     main() 
    except: socket.gaierror 
     err() 
def err(): 
    time.sleep(1) 
    con() 
def main(): 
    s.send("[+] Hello") 
with ThreadPoolExecutor as exe: 
    exe.submit(con) 
+0

तो तुम को पकड़ने के लिए 'चाहते KeyBoardInterrupt '? क्या आप यही पूछ रहे हैं? – laike9m

+0

तो आपका प्रश्न क्या है? – laike9m

+0

आप "आप प्रीसेट सीटीआरएल + सी" प्रिंट करने में सक्षम होना चाहते हैं? – laike9m

उत्तर

2

Here के एक समाधान। मुझे यकीन नहीं है कि आपको यह पसंद है, लेकिन मैं किसी और के बारे में नहीं सोच सकता। मैंने इसे काम करने के लिए अपना कोड संशोधित कर दिया है।

from concurrent.futures import ThreadPoolExecutor 
import time 

quit = False 

def pri(): 
    print("Hello World!!!") 

def start(): 
    while quit is not True: 
     time.sleep(1) 
     pri() 

try: 
    pool = ThreadPoolExecutor(max_workers=3) 
    pool.submit(start) 

    while quit is not True: 
     print("hei") 
     time.sleep(1) 
except KeyboardInterrupt: 
    quit = True 

यहाँ बिंदु हैं:

  1. जब आप with ThreadPoolExecutor(max_workers=3) as exe, यह इंतजार कर रहा है जब तक सभी कार्य किया गया है का उपयोग करें। यदि wait यह सच है तो इस विधि जब तक सभी लंबित वायदा को क्रियान्वित किया जाता है और प्रबंधक के साथ जुड़े संसाधन बंद कर दिया है नहीं लौटेगा Doc

    पर एक नज़र डालें। यदि प्रतीक्षा False है तो यह विधि तत्काल वापस आ जाएगी और निष्पादक के साथ जुड़े संसाधनों को मुक्त कर दिया जाएगा जब सभी लंबित वायदा निष्पादित किए जाएंगे। प्रतीक्षा के मूल्य के बावजूद, पूरा पाइथन प्रोग्राम तब तक बाहर नहीं निकलेगा जब तक सभी लंबित वायदा निष्पादित नहीं किए जाते।

    आप इस पद्धति स्पष्ट रूप से कॉल करने के लिए यदि आप with बयान का उपयोग होने से बचने कर सकते हैं जो कि बंद Executor

    यह एक पर join() बुला की तरह है (जैसे कि Executor.shutdown()True को प्रतीक्षा सेट के साथ कहा जाता था प्रतीक्षा में) धागा।
    इसलिए मैं इसे लाए गए:

    pool = ThreadPoolExecutor(max_workers=3) 
    pool.submit(start) 
    
  2. मुख्य धागा "काम" कर रही होगी एक Ctrl + C को पकड़ने के लिए सक्षम होने के लिए। तो तुम सिर्फ वहाँ मुख्य थ्रेड और बाहर निकलने नहीं छोड़ सकते, सबसे आसान तरीका है एक अनंत लूप

  3. अब चलाने के लिए आप एक पाश मुख्य थ्रेड, जब आप CTRL+C हिट में चल रहा है वह यह है कि, कार्यक्रम except KeyboardInterrupt ब्लॉक दर्ज करें और होगा quit=True सेट करें। फिर आपका कार्यकर्ता धागा बाहर निकल सकता है।

कड़ाई से बोलते हुए, यह केवल एक कामकाज है। ऐसा लगता है कि इसके लिए एक और तरीका असंभव है।

संपादित
मुझे यकीन है कि क्या आपको परेशान नहीं कर रहा हूँ, लेकिन आप समस्या के बिना किसी अन्य सूत्र में अपवाद पकड़ कर सकते हैं:

import socket 
import time 
from concurrent.futures import ThreadPoolExecutor 
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 

def con(): 
    try: 
     raise socket.gaierror 
     main() 
    except socket.gaierror: 
     print("gaierror occurred") 
     err() 

def err(): 
    print("err invoked") 
    time.sleep(1) 
    con() 

def main(): 
    s.send("[+] Hello") 

with ThreadPoolExecutor(3) as exe: 
    exe.submit(con) 

आउटपुट

gaierror occurred 
err invoked 
gaierror occurred 
err invoked 
gaierror occurred 
err invoked 
gaierror occurred 
... 
+0

दुर्भाग्य से, यह वही नहीं है जो मुझे चाहिए। मुझे फ़ंक्शन से अपवादों को पकड़ने की आवश्यकता है। लेकिन यह एक उत्थान का हकदार है। क्या मेरी समस्या हल हो सकती है python2.7? –

+0

"अपवाद पकड़ो"! = "पकड़ो ctrl + c"। यदि आप कीबोर्ड इंटरप्ट को पकड़ना चाहते हैं, तो मुझे डर है कि यह एकमात्र तरीका है। – laike9m

+0

मैं एक सॉकेट गाई त्रुटि –

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