में ctypes के माध्यम से धागा स्थानीय भंडारण के साथ साझा लाइब्रेरी का उपयोग कर रहा अजगर में ctypes
मॉड्यूल का उपयोग कर रहा एक साझा सी पुस्तकालय है, जो स्थानीय भंडारण थ्रेड शामिल लोड करने के लिए। यह एक लंबा इतिहास के साथ एक काफी बड़ी सी पुस्तकालय है, कि हम धागे को सुरक्षित बनाने की कोशिश कर रहे हैं। पुस्तकालय में बहुत से वैश्विक चर और स्थिरताएं हैं, इसलिए थ्रेड सुरक्षा की दिशा में हमारी प्रारंभिक रणनीति थ्रेड स्थानीय संग्रहण का उपयोग करना है। हम चाहते हैं कि हमारी लिबररी प्लेटफार्म स्वतंत्र हो, और Win32, win64 और 64-bit उबंटू दोनों पर थ्रेड सुरक्षा का संकलन और परीक्षण कर रहा है। एक शुद्ध सी प्रक्रिया से कोई समस्या नहीं प्रतीत होती है।मेमोरी रिसाव जब एक अजगर कार्यक्रम
हालांकि Win32 और उबंटू पर पायथन (2.6 और 2.7) में हम मेमोरी लीक देख रहे हैं। ऐसा लगता है कि एक पाइथन धागा समाप्त होने पर थ्रेड स्थानीय भंडारण ठीक से जारी नहीं किया जा रहा है। या कम से कम कि किसी भी तरह से अजगर प्रक्रिया "जागरूक" नहीं है कि स्मृति मुक्त हो गई है। एक ही समस्या भी वास्तव में Win32 पर एक ग # -program में देखा जाता है, लेकिन यह हमारे win64 सर्वर परीक्षण मशीन पर मौजूद नहीं है (चल अजगर 2.7 भी)।
समस्या इस तरह एक साधारण खिलौना उदाहरण के साथ reproduced किया जा सकता है:
एक सी फ़ाइल युक्त बनाएँ (linux/unix
पर __declspec(dllexport)
निकालने के लिए): खिड़कियों पर
#include <stdio.h>
#include <stdlib.h>
void __declspec(dllexport) Leaker(int tid){
static __thread double leaky[1024];
static __thread int init=0;
if (!init){
printf("Thread %d initializing.", tid);
int i;
for (i=0;i<1024;i++) leaky[i]=i;
init=1;}
else
printf("This is thread: %d\n",tid);
return;}
संकलित बुद्धि MINGW
/लिनक्स पर जीसीसी जैसे:
gcc -o leaky.dll
(या leaky.so
) -shared the_file.c
खिड़कियों पर हम दृश्य स्टूडियो के साथ संकलित किया जा सकता था, __declspec(thread)
साथ __thread
की जगह। हालांकि Win32 पर (अप winXP को मेरा मानना है कि), यह अगर पुस्तकालय LoadLibrary
साथ क्रम में लोड किया जा रहा है काम नहीं करता।
import threading, ctypes, sys, time
NRUNS=1000
KEEP_ALIVE=5
REPEAT=2
lib=ctypes.cdll.LoadLibrary("leaky.dll")
lib.Leaker.argtypes=[ctypes.c_int]
lib.Leaker.restype=None
def UseLibrary(tid,repetitions):
for i in range(repetitions):
lib.Leaker(tid)
time.sleep(0.5)
def main():
finished_threads=0
while finished_threads<NRUNS:
if threading.activeCount()<KEEP_ALIVE:
finished_threads+=1
thread=threading.Thread(target=UseLibrary,args=(finished_threads,REPEAT))
thread.start()
while threading.activeCount()>1:
print("Active threads: %i" %threading.activeCount())
time.sleep(2)
return
if __name__=="__main__":
sys.exit(main())
त्रुटि पुन: पेश करने के लिए पर्याप्त है कि:
अब की तरह एक अजगर कार्यक्रम बना सकते हैं। स्पष्ट रूप से कचरा कलेक्टर आयात करते हैं, जब से आपसे प्रत्येक नया थ्रेड मदद नहीं करता है एक collect gc.collect()
कर।
थोड़ी देर के लिए मैंने सोचा कि समस्या को असंगत रनटाइम (विजुअल स्टूडियो के साथ संकलित पायथन, MINGW
के साथ मेरी लाइब्रेरी) के साथ करना पड़ा था। लेकिन समस्या यह है Ubuntu पर नहीं, बल्कि एक win64 सर्वर पर भी है, पुस्तकालय MINGW
साथ संकलित पार है, तब भी जब।
आशा है कि कोई भी मदद कर सके!
चीयर्स, साइमन कोक्केन्डोरफ, राष्ट्रीय सर्वेक्षण और डेनमार्क के कैडस्ट्रे।
की समीक्षा करें जाना जाता अजगर कीड़े http://bugs.python.org/issue6627 http://bugs.python.org/issue3757 –
आप सी में धागा पास पर अपने टपकाया चर मुक्त कर सकते हैं? इसे ठीक करने के लिए –
, malloc का उपयोग करने का प्रयास करें और सरणी – pyCthon