第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何在給定 pid 的情況下通知守護(hù)進(jìn)程

如何在給定 pid 的情況下通知守護(hù)進(jìn)程

動(dòng)漫人物 2021-10-12 10:14:16
所以我一直在用 python 弄濕我的腳,試圖構(gòu)建一個(gè)與 gnome 通知 ui 相關(guān)的提醒系統(tǒng)。基本思想是你在你的 shell 中輸入一個(gè)命令remind me to check on dinner in 20 min,然后在 20 分鐘內(nèi)你會(huì)收到一個(gè)桌面通知,上面寫著“檢查晚餐”。我這樣做的方法是讓腳本解析消息并寫入應(yīng)該發(fā)送通知的時(shí)間以及應(yīng)該發(fā)送到日志文件的消息。通知由 python 守護(hù)進(jìn)程觸發(fā)。我正在使用我在網(wǎng)上找到的這個(gè)守護(hù)進(jìn)程設(shè)計(jì)。我看到的問題是當(dāng)這個(gè)守護(hù)進(jìn)程運(yùn)行時(shí),它占用了我 100% 的 CPU!我剝離了守護(hù)進(jìn)程正在做的所有代碼,當(dāng)所有守護(hù)進(jìn)程正在做的時(shí)候,我仍然有這個(gè)問題while True: last_modified = os.path.getmtime(self.logfile)我認(rèn)為這是一種糟糕的方法,我應(yīng)該在有新提醒時(shí)通知守護(hù)程序,然后大部分時(shí)間提醒守護(hù)程序應(yīng)該處于睡眠狀態(tài)?,F(xiàn)在這只是一個(gè)想法,但是當(dāng)我只知道守護(hù)進(jìn)程 pid 時(shí),我很難找到有關(guān)“如何通知進(jìn)程”的資源。因此,如果我用類似time.sleep(time_to_next_notification)的方式暫停了守護(hù)進(jìn)程,是否有辦法向守護(hù)進(jìn)程發(fā)送信號(hào),讓它知道有新的提醒?
查看完整描述

1 回答

?
森林海

TA貢獻(xiàn)2011條經(jīng)驗(yàn) 獲得超2個(gè)贊

盡管我相信您最好使用偵聽端口的服務(wù)器 - 客戶端類型的解決方案,但您要問的是 100% 可能使用signalos庫。這種方法不適用于多線程程序,但是因?yàn)樾盘?hào)僅由 python 中的父線程處理。此外,windows 不會(huì)以相同的方式實(shí)現(xiàn)信號(hào),因此選項(xiàng)更加有限。

信號(hào)

“客戶端”進(jìn)程可以使用os.kill(pid, signal). 您必須查看可用信號(hào)并確定要使用哪個(gè)信號(hào)(signal.NSIG可能是一個(gè)不錯(cuò)的選擇,因?yàn)樗粦?yīng)該影響任何其他默認(rèn)行為)。

啟動(dòng)時(shí)的“守護(hù)進(jìn)程”進(jìn)程必須注冊(cè)一個(gè)處理程序,以便在它接收到您選擇的信號(hào)時(shí)執(zhí)行什么操作。處理程序是一個(gè)您必須定義的函數(shù),它接收接收到的信號(hào)本身以及 executon ( def handler(signum, frame):)的當(dāng)前堆棧幀。如果你只用這個(gè)處理程序做一件事,并且它不需要知道它被調(diào)用時(shí)發(fā)生了什么,你可以忽略這兩個(gè)參數(shù)。然后您必須使用signal.signalex:注冊(cè)處理程序signal.signal(signal.NSIG, handler)。

從那里你會(huì)想找到一些合適的方法來等待下一個(gè)信號(hào)而不消耗太多資源。這可以像循環(huán)os.sleep 命令一樣簡(jiǎn)單,或者您可以嘗試變得花哨。我不確定 100% 從信號(hào)處理程序返回時(shí)如何恢復(fù)執(zhí)行,因此您可能需要關(guān)注遞歸深度(即,確保每次處理信號(hào)時(shí)都不要遞歸,否則您將永遠(yuǎn)能夠在需要重新啟動(dòng)之前處理有限數(shù)量的信號(hào))。

服務(wù)器

讓進(jìn)程監(jiān)聽端口(通常稱為服務(wù)器,但在功能上與您的“守護(hù)進(jìn)程”描述相同)而不是監(jiān)聽操作系統(tǒng)信號(hào)有幾個(gè)主要優(yōu)點(diǎn)。

  • 端口能夠在信號(hào)只能觸發(fā)事件的地方發(fā)送數(shù)據(jù)

  • 端口更相似跨平臺(tái)

  • 端口在多線程中玩得很好[r]

  • 端口使通過網(wǎng)絡(luò)發(fā)送消息變得容易(即:從手機(jī)創(chuàng)建提醒并在 PC 上執(zhí)行)

一次等待多件事

為了解決同時(shí)等待多個(gè)進(jìn)程的需要(偵聽輸入以及等待發(fā)送下一個(gè)通知),您有很多選擇:

  • 信號(hào)實(shí)際上可能是一個(gè)很好的用例,因?yàn)?code>signal.SIGALRM它可以用作方便地重新設(shè)置的鬧鐘(如果您使用的是 UNIX)。您可以像以前一樣設(shè)置處理程序,只需為下一個(gè)通知設(shè)置警報(bào)。設(shè)置警報(bào)后,您可以簡(jiǎn)單地繼續(xù)在端口上偵聽新任務(wù)。如果有新任務(wù)進(jìn)入,再次設(shè)置警報(bào)將覆蓋現(xiàn)有任務(wù),因此處理程序需要檢索下一個(gè)排隊(duì)通知并在第一個(gè)任務(wù)完成后重新設(shè)置警報(bào)。

  • 線程既可以用于輪詢通知任務(wù)隊(duì)列,也可以創(chuàng)建一個(gè)單獨(dú)的線程來等待每個(gè)任務(wù)。這不是一個(gè)特別優(yōu)雅的解決方案,但它會(huì)有效且易于實(shí)施。

  • 最優(yōu)雅的解決方案可能是使用asyncio協(xié)程,但是我對(duì) asyncio 不太精通,并且承認(rèn)它們比線程更令人困惑。


查看完整回答
反對(duì) 回復(fù) 2021-10-12
  • 1 回答
  • 0 關(guān)注
  • 172 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)