представьте, что вы есть Io тяжелую функцию:Easy Python ASync. Прекомпилятора?
def getMd5Sum(path):
with open(path) as f:
return md5(f.read()).hexdigest()
Как вы думаете, Python является достаточно гибкой, чтобы такой код (обратите внимание на $):
def someGuiCallback(filebutton):
...
path = filebutton.getPath()
md5sum = $getMd5Sum()
showNotification("Md5Sum of file: %s" % md5sum)
...
Чтобы быть казнены что-то вроде этого :
def someGuiCallback_1(filebutton):
...
path = filebutton.getPath()
Thread(target=someGuiCallback_2, args=(path,)).start()
def someGuiCallback_2(path):
md5sum = getMd5Sum(path)
glib.idle_add(someGuiCallback_3, md5sum)
def someGuiCallback_3(md5sum):
showNotification("Md5Sum of file: %s" % md5sum)
...
(glib.idle_add просто выталкивает функцию на очереди основного потока)
Я думал об использовании декораторов, но они не позволяют мне получить доступ к «содержимому» функции после вызова. (часть showNotification)
Я думаю, что я мог бы написать «компилятор», чтобы изменить код перед исполнением, но он не является швом, как оптимальное решение.
Есть ли у вас какие-либо идеи о том, как сделать что-то подобное выше?
Отличная идея с использованием генераторов! Я сделал версию, которая может включать и выключать mainthread любое количество раз: code.activestate.com/recipes/576952 По какой-то причине он блокирует случайные места, если я использую glib. Мне, наверное, придется спросить их об этом :) –