簡體   English   中英

在Python中暫停執行

[英]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.SIGUSR1signal.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.sleepinput )。

編輯編輯:這假定您在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM