想象你有一個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部分)
我想我可以編寫一個'編譯器'在執行前更改代碼,但它不像最佳解決方案那樣縫隙。
你有什麼想法,關於如何做上述事情?
使用發電機的好主意! 我製作了一個版本,可以開啓和關閉主線程任何次數:code.activestate.com/recipes/576952由於某種原因,如果我使用glib,它會在隨機地方出現死鎖。我可能不得不問他們有關:) – 2009-11-10 19:07:54