के लिए आउटपुट कारण मेरे पास एक ऐसा एप्लिकेशन है जो प्रत्येक कुछ मिनटों में सर्वरों का एक गुच्छा चुनाव करता है। ऐसा करने के लिए, यह सर्वर प्रति एक धागा मतदान पर (15 सर्वरों) spawns और एक वस्तु के लिए डेटा वापस लिखते हैं:पायथन क्रैश
import requests
class ServerResults(object):
def __init__(self):
self.results = []
def add_server(some_argument):
self.results.append(some_argument)
servers = ['1.1.1.1', '1.1.1.2']
results = ServerResults()
for s in servers:
t = CallThreads(poll_server, s, results)
t.daemon = True
t.start()
def poll_server(server, results):
response = requests.get(server, timeout=10)
results.add_server(response.status_code);
CallThreads
वर्ग एक सहायक समारोह एक समारोह (कॉल करने के लिए तर्क के साथ इस मामले poll_server()
में है (इस मामले में s
और results
), आप Python utility functions के मेरे गीथब रेपो में स्रोत देख सकते हैं। अधिकांश समय यह ठीक काम करता है, हालांकि कभी-कभी एक धागा अंतराल से लटकता है। मुझे यकीन नहीं है कि क्यों, मैं इसका उपयोग कर रहा हूं जीईटी अनुरोध पर टाइमआउट। किसी भी मामले में, अगर थ्रेड लटकता है तो लटका धागे घंटों या दिनों के दौरान बनते हैं, और फिर पायथन क्रैश हो जाता है:
File "/usr/lib/python2.7/threading.py", line 495, in start
_start_new_thread(self.__bootstrap,())
thread.error: can't start new thread
Exception in thread Thread-575 (most likely raised during interpreter shutdown)
Exception in thread Thread-1671 (most likely raised during interpreter shutdown)
Exception in thread Thread-831 (most likely raised during interpreter shutdown)
मैं इससे कैसे निपट सकता हूं? ऐसा लगता है कि killablockingthreadinPython कोई रास्ता नहीं है। इस एप्लिकेशन को रास्पबेरी पीआई पर चलाने की जरूरत है, इसलिए twisted जैसी बड़ी लाइब्रेरी फिट नहीं होंगी, असल में मुझे requests लाइब्रेरी से छुटकारा पाना होगा!
सबसे पहले, यह एक पीआई पर है जब यह लटकता है, या आप कहीं और परीक्षण कर रहे हैं? प्लेटफ़ॉर्म-विशिष्ट टूल हो सकते हैं जो थ्रेड कर रहे हैं यह देखने में मदद करेंगे, लेकिन आपने अपना प्लेटफ़ॉर्म निर्दिष्ट नहीं किया है। – Useless
दूसरा, 'अनुरोध' क्या है?इसे देखे बिना, यह कहना असंभव है कि – Useless
में दौड़ की स्थिति है, तीसरा, भले ही आप एक थ्रेड में सिंक्रोनस गैर-अवरुद्ध I/O का उपयोग न करें, – Useless