2012-05-25 2 views
5

निम्नलिखित कोड लिनक्स में अजगर 3.2.2 में कुछ भी करने के बिना लटकी हुई है:मल्टीप्रोसेसिंग के साथ अच्छी तरह से टिंकर क्यों नहीं खेलता है?

import tkinter 
from multiprocessing import Process 

def f(): 
    root = tkinter.Tk() 
    label = tkinter.Label(root) 
    label.pack() 
    root.mainloop() 

p = Process(target=f) 
p.start() 

केवल जानकारी मैं इस समस्या के बारे में पाया है issue 5527 है, जिसमें यह पाया गया है कि समस्या से पहले आयात किया जा रहा tkinter साथ है प्रक्रिया को फोर्क किया गया है, यह को f के अंदर आयात करके तय किया जा सकता है, और यह समस्या लिनक्स में होती है लेकिन सोलारिस नहीं होती है।

क्या किसी को पता है कि वास्तव में इस समस्या का कारण क्या है, और यदि यह जानबूझकर है या अंत में तय किया जाएगा? स्थानीय रूप से हर जगह tkinter आयात करने के अलावा कोई कामकाज है, मुझे इसकी आवश्यकता है (जो खराब शैली की तरह लगता है)? क्या किसी अन्य मॉड्यूल में मल्टीप्रोसेसिंग के साथ समान समस्याएं हैं?

+1

-0। आप समस्या जानते हैं। आप जानते हैं कि एक बग रिपोर्ट दायर की गई है। आप कामकाज जानते हैं। एकमात्र अन्य प्रमुख सवाल यह है कि "क्या किसी अन्य मॉड्यूल में मल्टीप्रोसेसिंग के साथ समान समस्याएं हैं?", जो थोड़ा सा खुला समाप्त होता है। –

+1

@ स्टेवेन रूंबल्स्की: मुझे समस्या नहीं पता - मुझे नहीं पता कि टिंकर क्या कर रहा है जो यहां काम करने में विफल रहता है, या यह मंच-निर्भर क्यों है। बग रिपोर्ट 3 साल पहले दायर की गई थी, और इस बात का कोई संकेत नहीं है कि कोई जानता है कि (या वास्तव में कौन सी स्थितियों में) ऐसा होता है या इसे कैसे ठीक किया जाए। हो सकता है कि मेरा आखिरी प्रश्न पढ़ना चाहिए "क्या कोई अन्य मानक लाइब्रेरी मॉड्यूल है जिसे किसी प्रक्रिया को फोर्क करने से पहले आयात नहीं किया जा सकता", जो थोड़ा अधिक विशिष्ट है। – James

उत्तर

0

मेरा संदेह यह है कि समस्या को एक्स सर्वर (आमतौर पर एक सॉकेट) के कनेक्शन से करना पड़ता है। यदि यह प्रक्रिया fork() -ed से पहले बनाई गई है, तो बच्चे की प्रक्रिया इस कनेक्शन को प्राप्त करती है। लेकिन अगर यह इसका उपयोग करने का प्रयास करता है, तो एक्स सर्वर भ्रमित हो जाता है।

Tkinter.py पर एक सरसरी नज़र के बाद, यह शायद प्रक्रिया शुरू करने उपयोगी हो सकता है इससे पहले कि NoDefaultRoot फ़ंक्शन को कॉल की तरह दिखता है। यह सब पर निर्भर करता है जब एक्स सर्वर से कनेक्शन बनाया जाता है।

अन्यथा कांटा के बाद टिंकर आयात करने का तरीका लगता है।

0

सितंबर 2013 तक, बग रिपोर्ट पर कुछ अतिरिक्त टिप्पणियां हैं जो वास्तविक समस्या के बारे में अधिक जानकारी देते हैं।

http://bugs.python.org/issue5527#msg194848
http://bugs.python.org/issue5527#msg195480

ऊपर के आधार पर, मैं निम्नलिखित की तरह कुछ अनुमान लगा रहा हूँ क्या हो रहा है: Tkinter सुरक्षित थ्रेड नहीं है, इसलिए (जो भी कारण के लिए) Tkinter जो धागा जानना चाहता है मुख्य थ्रेड है । टिंकर मानते हैं कि मुख्य थ्रेड जब टिंकर मॉड्यूल लोड होता है तो प्रोग्राम निष्पादन के लिए मुख्य धागा भी होगा। जब आप टिंकटर लोड करने के बाद कांटा या मल्टीप्रोसेस करते हैं, तो यह धारणा टूट जाती है। (उदाहरण के लिए, एक कांटा के बाद, याद किया मुख्य धागा माता-पिता में है, बच्चे नहीं।)

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