[英]Pause Execution in Python
我正在實現一個Python插件,它是一個較大的C ++程序的一部分。 該程序的目標是允許用戶使用Python輸入命令的動作。 當前,它從C ++函數接收一個字符串,並通過exec()函數運行它。 然后,用戶可以使用API來影響較大的C ++程序的更改。
我正在使用的當前功能是暫停執行功能。 它需要記住它在代碼執行中的位置以及任何局部變量的狀態,並在滿足條件后恢復執行。 我對Python不太熟悉,我想對如何實現此功能提出一些建議。 我的第一個設計思路:
1)使用yield命令。 一開始這似乎是個好主意,因為當您使用下一條命令時,它會記住我需要的所有內容,但是問題是,據我所知,yield只能返回到調用堆棧中的上一級。 因此,如果用戶調用產生函數的函數,它將僅返回用戶代碼,而不返回較大的C ++程序。 據我所知,沒有辦法在堆棧上傳播yield命令。
2)線程創建一個主python線程,該線程為每個命令創建一個線程。 該主線程將為每個執行的命令生成一個線程,並在完成時將其殺死。 如果需要暫停並重新啟動它,則可以通過鎖隊列來完成。
這些是我提出的僅有的兩個選擇。 我不確定yield函數是否可以正常工作或設計的目的。 我認為線程化方法會起作用,但可能會過大,並且需要很長時間才能開發。 我也在尋找Python中的某種Task Module,但找不到確切的內容。 我想知道是否有人對我不太熟悉,所以還有其他建議。
編輯:如評論中所述,我沒有解釋腳本“暫停”時需要發生什么。 python插件需要允許C ++程序繼續執行。 在我看來,這意味着A)如果我們正在談論單線程方法,則返回,或者B)向C ++發送消息(函數調用?)
編輯編輯:如上所述,我沒有完全解釋問題的描述。 我將發表另一篇文章,更好地說明當前存在的內容,需要發生的事情以及提供一些sudo代碼。 我是Stack Overflow的新手,所以如果這不是適當的答復,請告訴我。
每當使用Python發送信號時,執行都會立即暫停,直到使用完任何信號處理程序函數為止; 此時,執行將從中斷處繼續執行。 我的建議是使用用戶定義的信號之一( signal.SIGUSR1
和signal.SIGUSR2
)。 在這里查看signal
文檔:
https://docs.python.org/2/library/signal.html
在程序的開始,您將定義一個信號處理程序函數,如下所示:
def signal_pause(signum, frame):
if signum == signal.SIGUSR1:
# Do your pause here - function processing, etc
else:
pass
然后在主程序中的某個位置,您將為剛剛創建的信號處理程序切換默認的信號處理程序:
signal.signal(signal.SIGUSR1, signal_pause)
最后,無論何時要暫停,您都將發送SIGUSR1
信號,如下所示:
os.kill(os.getpid(),signal.SIGUSR1)
您的代碼將立即暫停,保存其狀態,然后轉到signal_pause
函數以執行所需的任何操作。 該函數退出后,將恢復正常程序執行。
編輯:這假設您要在暫停程序的同時做一些復雜的事情。 如果您只想等待幾秒鍾或要求用戶輸入一些信息,則可以使用一些更簡單的方法(分別是time.sleep
或input
)。
編輯編輯:這假定您在Unix系統上。
如果您需要與C程序進行通信,則套接字可能是您的最佳選擇。
https://docs.python.org/2/library/socket.html
您的兩個程序之一充當套接字服務器,另一個程序作為套接字客戶端連接到它。 當您希望C ++程序繼續運行時,可以使用socket.send()
來發送繼續消息。 然后,您的Python程序將使用socket.recv()
,這將使其等待,直到收到來自C ++程序的消息。
如果您需要兩個程序來相互發送信號,這可能是最安全的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.