Есть ли способ создать объекты и работать с ними не в основном потоке? Я прочитал this link, но не понимаю, как применить его к моему примеру (см. Ниже).PyGObject: Как работать с объектами в потоке?
import threading
from gi.repository import Gtk, Gdk, GObject, GLib
class Foo:
def bar(self):
pass
class ListeningThread(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.cls_in_thread = None
def foo(self, _):
self.cls_in_thread = Foo()
print(threading.current_thread())
print('Instance created')
def bar(self, _):
self.cls_in_thread.bar()
print(threading.current_thread())
print('Instance method called')
def run(self):
print(threading.current_thread())
def main_quit(_):
Gtk.main_quit()
if __name__ == '__main__':
GObject.threads_init()
window = Gtk.Window()
box = Gtk.Box(spacing=6)
window.add(box)
lt = ListeningThread()
lt.daemon = True
lt.start()
button = Gtk.Button.new_with_label("Create instance in thread")
button.connect("clicked", lt.foo)
button2 = Gtk.Button.new_with_label("Call instance method in thread")
button2.connect("clicked", lt.bar)
box.pack_start(button, True, True, 0)
box.pack_start(button2, True, True, 0)
window.show_all()
window.connect('destroy', main_quit)
print(threading.current_thread())
Gtk.main()
Чтобы быть более точным здесь выход я получить сейчас:
<ListeningThread(Thread-1, started daemon 28268)>
<_MainThread(MainThread, started 23644)>
<_MainThread(MainThread, started 23644)>
Instance created
<_MainThread(MainThread, started 23644)>
Instance method called
И я хотел бы, чтобы это было примерно так:
<ListeningThread(Thread-1, started daemon 28268)>
<_MainThread(MainThread, started 23644)>
<ListeningThread(Thread-1, started daemon 28268)>
Instance created
<ListeningThread(Thread-1, started daemon 28268)>
Instance method called
Кроме того, я хотел бы быть что cls_in_thread
существует в той же теме (в документах я нашел threading.local()
, но я не уверен, если это необходимо). Есть ли способ добиться такого поведения?