मैंने लगभग 50 कक्षाएं लिखीं जिनका उपयोग मैं मशीनीकरण और थ्रेडिंग का उपयोग करके वेबसाइटों के साथ कनेक्ट करने और काम करने के लिए करता हूं। वे सभी एक साथ काम करते हैं, लेकिन वे एक-दूसरे पर निर्भर नहीं हैं। तो इसका मतलब है 1 वर्ग - 1 वेबसाइट - 1 धागा। यह विशेष रूप से कोड का प्रबंधन करने के लिए विशेष रूप से सुरुचिपूर्ण समाधान नहीं है, क्योंकि प्रत्येक वर्ग में बहुत से कोड दोहराए जाते हैं (लेकिन तर्कों को पारित करने के लिए इसे एक वर्ग में बनाने के लिए लगभग पर्याप्त नहीं है, क्योंकि कुछ साइटों को विधियों के बीच में पुनर्प्राप्त डेटा की अतिरिक्त प्रसंस्करण की आवश्यकता हो सकती है - 'लॉगिन' की तरह - दूसरों को शायद इसकी आवश्यकता नहीं है)। जैसा कि मैंने कहा, यह सुरुचिपूर्ण नहीं है - लेकिन यह काम करता है। कहने की जरूरत नहीं है कि मैं सभी सिफारिशों का स्वागत करता हूं कि प्रत्येक वेबसाइट दृष्टिकोण के लिए 1 वर्ग का उपयोग किये बिना इसे बेहतर तरीके से कैसे लिखना है। प्रत्येक वर्ग की अतिरिक्त कार्यक्षमता या समग्र कोड प्रबंधन जोड़ना एक कठिन काम है।थ्रेडेड पायथन कोड के मेमोरी उपयोग को कैसे कम करें?
हालांकि, मुझे पता चला, कि प्रत्येक धागा, 8MB स्मृति के बारे में लेता है तो 50 चल धागे के साथ के बारे में हम 400MB उपयोग को देख रहे हैं। अगर यह मेरे सिस्टम पर चल रहा था तो मुझे इसके साथ कोई समस्या नहीं होगी, लेकिन चूंकि यह केवल 1 जीबी मेमोरी के साथ वीपीएस पर चल रहा है, यह एक मुद्दा बनना शुरू हो रहा है। क्या आप मुझे बता सकते हैं कि मेमोरी उपयोग को कैसे कम किया जाए, या क्या कई साइटों के साथ काम करने के लिए कोई अन्य तरीका है?
मैं अगर यह अपने आवेदन की चर कि स्मृति, या कुछ और उपयोग कर रहा है में संग्रहीत डेटा है परीक्षण करने के लिए इस त्वरित परीक्षण अजगर कार्यक्रम का इस्तेमाल किया। जैसा कि आप निम्न कोड में देख सकते हैं, यह केवल नींद() फ़ंक्शन को प्रोसेस कर रहा है, फिर भी प्रत्येक थ्रेड 8 एमबी मेमोरी का उपयोग कर रहा है।
from thread import start_new_thread
from time import sleep
def sleeper():
try:
while 1:
sleep(10000)
except:
if running: raise
def test():
global running
n = 0
running = True
try:
while 1:
start_new_thread(sleeper,())
n += 1
if not (n % 50):
print n
except Exception, e:
running = False
print 'Exception raised:', e
print 'Biggest number of threads:', n
if __name__ == '__main__':
test()
जब मैं इस चलाने के लिए, उत्पादन होता है:
total used free shared buffers cached
Mem: 1536 1533 2 0 0 0
-/+ buffers/cache: 1533 2
Swap: 0 0 0
वास्तविक:
50
100
150
Exception raised: can't start new thread
Biggest number of threads: 188
और running = False
लाइन को हटाने के द्वारा, मैं तो खोल में free -m
आदेश का उपयोग कर मुक्त स्मृति को माप सकते हैं गणना क्यों मुझे पता है कि यह लगभग 8 एमबी प्रति थ्रेड ले रहा है, तब उपर्युक्त परीक्षण आवेदन से पहले और उसके दौरान उपयोग की गई स्मृति के अंतर को विभाजित करने से विभाजित करना सरल है जी, अधिकतम धागे से विभाजित यह शुरू करने में कामयाब रहे।
यह शायद केवल आवंटित स्मृति है, क्योंकि top
पर देखकर, पायथन प्रक्रिया केवल 0.6% स्मृति का उपयोग करती है।
स्मृति क्या ले रहा है? मैं अनुमान लगाता हूं कि यह वह डेटा है जिसे आप साइट से निकाल रहे हैं। यदि ऐसा है, तो शायद ऐसा नहीं है कि आप निष्पादन धागे की संख्या को थ्रॉटल करने से कम कर सकें। –
आप मेमोरी उपयोग को बिल्कुल कैसे मापते हैं? मुझे लगता है कि, उन 8 एमबी वास्तव में प्रत्येक एकल धागे को आवंटित नहीं किया जाता है। उन 8 एमबी का एक बड़ा हिस्सा धागे के बीच साझा किया जा सकता है (बस एक अनुमान ..)? – Frunsi
डेमियन और फ्रांसी, मैंने आपके दोनों सवालों के जवाब देने के लिए अपना प्रश्न संपादित किया। धन्यवाद! – Gargauth