2010-06-30 11 views
5

ऐसा लगता है कि आईडीईएल (मानक पायथन विंडोज इंस्टॉलेशन का हिस्सा) बिना मल्टी लटकते या बगआउट क्रैश के ठीक से बहुप्रचारित प्रोग्राम निष्पादित नहीं करेगा। क्या किसी को इसे ठीक करने के तरीके के बारे में पता है?मल्टीथ्रेडिंग के साथ पाइथन आईडीईएल संगत?

जब सीधे पायथन दुभाषिया के साथ निष्पादित निम्नलिखित कार्यक्रम हमेशा निष्क्रिय लेकिन आम तौर पर पूरा में रखती हूँ: हमेशा

U:\dev\py\multithreadtest>python mt.py 
0 
1 
2 
3 
4 
5 
6 
7 
8 
9 
1277935368.84 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
1277935369.84 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
1277935370.84 
1277935371.84 
all done! 

उत्पादन के दौरान प्रयोग में "रन मॉड्यूल" का उपयोग कर समारोह:

import threading, time 

printLock = threading.Lock() 

def pl(s): 
    printLock.acquire() 
    print s 
    printLock.release() 

class myThread(threading.Thread): 
    def run(self): 
    i = 0 
    for i in range(0,30): 
     pl(i) 
     time.sleep(0.1) 

t = myThread() 
t.start() 

while threading.activeCount() > 1: 
    time.sleep(1) 
    pl(time.time()) 

print "all done!" 

नमूना उत्पादन मेरी मशीन पर 23 या 24 पढ़ने वाली रेखा के आसपास अनिश्चित काल तक लटका हुआ है।

उत्तर

2

AFAIK IDLE में थ्रेडेड कोड चलाते समय यह एक क्रैशशूट है। आईडीएलई जीआईएल का उदारतापूर्वक उपयोग करता है इसलिए दौड़ की स्थिति और डेडलॉक्स आम हैं। दुर्भाग्यवश, मैं थ्रेडिंग में पर्याप्त रूप से अच्छी तरह से ज्ञात नहीं हूं, इस थ्रेड-सुरक्षित को स्पष्ट रूप से परे, अंतर्दृष्टि प्रदान करने के लिए अंतर्दृष्टि प्रदान करता हूं।

+2

आईडीईएल टिंकर में लिखा गया है, WxPython नहीं। –

+0

निष्क्रिय पाइथन और पायथन कोड में लिखा गया है सीधे जीआईएल का उपयोग नहीं करता है। AFAIK, थ्रेडिंग मॉड्यूल के निष्क्रिय का उपयोग थ्रेडिंग और कंडीशन क्लासेस और वर्तमान_थ्रेड फ़ंक्शन तक ही सीमित है। –

1

आईडीएलई में थ्रेडिंग की बात आने पर कुछ ज्ञात समस्याएं हैं। मुझे के विवरणों के बारे में भारी मात्रा में पता नहीं है क्यों यह एक मुद्दा है, क्योंकि मैं आईडीएलई से दूर रहने के लिए अपनी सबसे कठिन कोशिश करता हूं, लेकिन मुझे पता है कि यह है। मैं दृढ़ता से सुझाव दूंगा कि आप विजुअल स्टूडियो के लिए आयरनपीथन और पायथन टूल प्राप्त करें। वीएस के डिबगिंग टूल बिल्कुल बेजोड़ हैं, विशेष रूप से ऐड-ऑन की विशाल लाइब्रेरी दी गई है।

1
import threading 
print(threading.activeCount()) 

कमांड लाइन पर चलाए जाने पर 1 प्रिंट करता है, 2 निष्क्रिय होने पर 2। तो आपका लूप

while threading.activeCount() > 1: 
    time.sleep(1) 
    pl(time.time()) 

कंसोल में समाप्त हो जाएगा लेकिन हमेशा निष्क्रिय में जारी रहेगा।

आयात के बाद पोस्ट कोड में समस्या की तरह

initial_threads = threading.activeCount() 

कुछ ठीक, जोड़ सकते हैं और इस बदलाव के साथ

while threading.activeCount() > initial_threads: 

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

+0

किसी भी अन्य प्रबंधित वातावरण के तहत चलने पर या जब मॉड्यूल थ्रेडिंग आयात करने वाला पहला नहीं होता है तो 1 से ऊपर थ्रेडिंग.एक्टिवउंट 'प्रारंभ' का एक ही मुद्दा हो सकता है। –

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