2012-05-25 27 views
5

Các mã sau đây bị treo mà không làm bất cứ điều gì trong python 3.2.2 trong linux:Tại sao tkinter không chơi độc đáo với đa xử lý?

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() 

Thông tin duy nhất tôi đã tìm thấy về vấn đề này là issue 5527, trong đó cần lưu ý rằng vấn đề là với tkinter được nhập khẩu trước quy trình được chia nhỏ, có thể sửa bằng cách nhập tkinter bên trong hàm f và sự cố xảy ra trong Linux nhưng không phải là Solaris.

Có ai biết chính xác điều gì đang gây ra sự cố này không và liệu nó có chủ ý hoặc cuối cùng sẽ được khắc phục không? Có cách nào khác ngoài việc nhập tkinter tại địa phương ở mọi nơi tôi cần (có vẻ như kiểu xấu) không? Có bất kỳ mô-đun nào khác có vấn đề tương tự với đa xử lý không?

+1

-0. Bạn biết vấn đề. Bạn biết rằng một báo cáo lỗi đã được đệ trình. Bạn biết cách giải quyết. Câu hỏi lớn khác duy nhất là "Làm bất kỳ mô-đun nào khác có vấn đề tương tự với đa xử lý?", Có vẻ như một chút mở kết thúc. –

+1

@StevenRumbalski: Tôi không biết vấn đề gì - tôi không biết tkinter đang làm gì không hoạt động ở đây, hoặc tại sao nó phụ thuộc vào nền tảng. Báo cáo lỗi đã được đệ trình cách đây hơn 3 năm, và không có dấu hiệu cho thấy bất kỳ ai biết tại sao (hoặc dưới chính xác điều kiện nào) điều này xảy ra hoặc cách khắc phục. Có lẽ câu hỏi cuối cùng của tôi cần phải đọc "là có bất kỳ mô-đun thư viện chuẩn nào khác không thể được nhập trước khi tiến hành một quá trình", cụ thể hơn một chút không. – James

Trả lời

0

Nghi ngờ của tôi là sự cố phải liên quan đến kết nối với máy chủ X (thường là ổ cắm). Nếu điều này được tạo trước khi quá trình là fork() -ed, quá trình con sẽ thừa hưởng kết nối này. Nhưng nếu nó cố gắng sử dụng nó, máy chủ X bị lẫn lộn.

Sau khi xem lướt qua tại Tkinter.py, có vẻ như có thể gọi chức năng NoDefaultRoot trước khi bắt đầu quá trình có thể sẽ hữu ích. Tất cả phụ thuộc vào khi kết nối với máy chủ X được thực hiện.

Nếu không, hãy nhập Tkinter sau khi ngã ba dường như là cách để đi.

0

Kể từ tháng 9 năm 2013, có một số nhận xét bổ sung về báo cáo lỗi cung cấp thông tin chi tiết hơn về vấn đề thực tế là gì.

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

Dựa trên việc trên, tôi đoán giống như sau đang xảy ra: Tkinter không phải là thread an toàn, vì vậy (vì lý do gì) Tkinter muốn biết mà chủ đề là các chủ đề chính . Tkinter giả định rằng chủ đề chính khi mô-đun Tkinter được tải cũng sẽ là chủ đề chính để thực hiện chương trình. Khi bạn ngã ba hoặc đa xử lý sau khi tải Tkinter, giả định này bị hỏng. (Ví dụ, sau ngã ba, chủ đề chính được nhớ nằm trong phụ huynh, không phải là con.)

Các vấn đề liên quan