以前已經討論過這一點,並且從外部看起來可以殺死協程的所有東西都可以做到。對於調度員來說這當然是不實際的。有沒有辦法從外部暫停一個協程或可能是一種解決方法?從外部函數暫停lua協程以用於調度程序
1
A
回答
1
從C API,你可以set a hook,這將產生$n
線/指令後。 (這是不可能通過debug.sethook
,因爲它增加了一箇中間層,防止它的工作。)
你可以把它包裝成一個可以暴露給Lua的函數,所以除了添加那個功能,你可以從Lua做到。例如:
static int setyieldhook(lua_State * L) {
lua_State * coro;
int steps;
luaL_checktype(L, 1, LUA_TTHREAD);
coro = lua_tothread(L, 1);
steps = luaL_optinteger(L, 2, 0);
if (steps <= 0) {
lua_sethook(coro, NULL, 0, 0);
} else {
lua_sethook(coro, yieldhook, LUA_MASKCOUNT, steps);
}
return 0;
}
然後只是將它作爲函數推送給Lua併爲其命名,例如, debug.setyieldhook
。
這一個將用作debug.setyieldhook(coro, timeout)
並且只要協程運行,它將在timeout
之後產生Lua指令。要清除,debug.setyieldhook(coro, 0)
。 (注:不能更改/通過debug.sethook
,反之亦然刪除通過setyieldhook
設置掛鉤 - 這將拋出一個錯誤,或者靜靜地創建一個爛攤子,但你可以擴展setyieldhook
檢測&明確的「正常」的Lua掛鉤,和/或包裝debug.sethook
來。檢查&清除產量掛鉤)
其他的事情需要提防:
- 如果協程
yield
S,這不會復位定時器掛鉤。 - 協程將產生不返回任何東西,所以你可能要 包裝
coroutine.yield
和/或coroutine.resume
這樣你就可以從超時分辨 「正常」yield
小號yield
秒。 - C函數不會計算處理的指令數量,所以 不會觸發掛鉤(例如,長期運行的非貪婪字符串匹配通過
string.*
),所以這不提供硬定時保證。
相關問題
- 1. 從Lua程序中調用python函數
- 2. 替代Pluto庫來在Lua中序列化暫停的協程?
- 3. 暫停事件調度程序
- 4. 獲取函數用於在Lua中創建協程/線程
- 5. 如何在lua協程中調用Java函數?
- 6. 如何從多個來源的外部庫調用lua函數?
- 7. 暫停應用程序
- 8. 從DXL調用外部程序
- 9. C++程序停止在函數調用
- 10. 在應用程序暫停時從小部件打開應用程序
- 11. 停止從外部線程
- 12. 在調試點暫停程序?
- 13. 泛型協程暫停類型
- 14. 應用程序從任務調度程序停止工作
- 15. 調用sinatra從模塊內部暫停?
- 16. 從應用程序外部調用Sparkle更新程序
- 17. 如何從Lua調用程序
- 18. Lua嵌套協程
- 19. 從外部應用程序
- 20. 從外部應用程序
- 21. 如何在程序調用之前暫停進程?
- 22. 如何從常用助手外部應用程序文件夾調用函數?
- 23. 從協程直接調用Python的協同程序
- 24. Thread.sleep暫停整個程序
- 25. 暫停組裝程序
- 26. 程序暫停在循環
- 27. 暫停外部SVG動畫
- 28. 如何以編程方式暫停應用程序?
- 29. 以編程方式暫停/關閉應用程序
- 30. 從Delphi應用程序調用外部函數(C++)時的訪問衝突
這是一個可行的選項,我可以使用,但很快的問題是,有沒有在標準lua中可以使用的任何實現?也許在某些代碼行間隔插入coroutine.yield()到執行函數中?對我來說,爲我的環境設置C有點不方便,但如果不存在,我將使用上面的選項 – Varscott11
@ Varscott11嗯,可以包裝庫函數以遞增內部(共享)計數器並偶爾產出'。 (所以你基本上是在模擬一個操作系統,比方說,所有'io','os',... functions_can_如果時間到了,就會產生。)或者可能(沒有試過這個)設置一個正常的鉤子任意超時條件,它只用'__index' /'__newindex'替代全局環境或一些經常訪問的事物。當metamethod觸發時,它將它改回到正常的東西,yield,然後(繼續之後)重新對正常的東西進行劫持操作。 – nobody
@ Varscott11(但是這些都是蠻幹的,並不是你想要的,它可以用來進行快速測試等等,但是有很多潛在的奇怪的相互作用和難以測試的破損。如果你想在圖書館使用它/通過C提供給其他人/ ...) – nobody