日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

PHP 高性能的事件循環庫 Revolt

來源: 責編: 時間:2024-02-01 12:44:44 278觀看
導讀Revolt是什么?Revolt是并發PHP應用程序的堅如磐石的事件循環。通常的PHP應用程序將大部分時間花在等待I/O上。雖然PHP是單線程的,但可以使用協作多任務來允許并發性,方法是使用等待時間來做不同的事情。PHP的傳統同步執

Revolt是什么?

Revolt是并發PHP應用程序的堅如磐石的事件循環。通常的PHP應用程序將大部分時間花在等待I/O上。雖然PHP是單線程的,但可以使用協作多任務來允許并發性,方法是使用等待時間來做不同的事情。U9U28資訊網——每日最新資訊28at.com

PHP的傳統同步執行流程很容易理解。一次只做一件事。如果查詢數據庫,則發送查詢并等待數據庫服務器的響應。一旦你有了答案,你就可以開始做下一件事。U9U28資訊網——每日最新資訊28at.com

ReactPHP和其他庫已經在PHP中提供了很長一段時間的協作多任務。然而,它們的事件驅動特性與許多現有的接口不兼容,需要不同的思維模型。PHP 8.1內置了fibers,它提供了協作多線程。調用可以是異步的,沒有promise或回調,同時仍然允許非阻塞I/O。U9U28資訊網——每日最新資訊28at.com

每個使用協同多任務的應用程序都需要一個調度器(也稱為事件循環),這個包提供了這個調度器。Revolt是結合了React和ReactPHP的事件循環實現的多年經驗的結果。然而,它并不是一個用于編寫并發PHP應用程序的成熟框架,而只是提供了必要的公共基礎。不同的(強烈的)固執己見的庫可以在它的基礎上構建,React和ReactPHP將繼續共存。U9U28資訊網——每日最新資訊28at.com

Revolt 支持事件

  • Defer 回調在事件循環的下一次迭代中執行。如果有延遲調度,事件循環不會在迭代之間等待。
  • Delay 在指定的秒數后執行回調。秒的分數可以表示為浮點數。
  • Repeat 在指定的秒數后重復執行回調。秒的分數可以表示為浮點數。
  • Stream readable 當流上有數據要讀取或連接關閉時,將執行回調。
  • Stream writable 當寫緩沖區中有足夠的空間來接受要寫入的新數據時,就會執行回調。
  • Signal 當進程從操作系統接收到特定信號時執行回調。

安裝

composer require revolt/event-loop

注意:此包可以作為Composer依賴項安裝在PHP 8.1及更高版本上。U9U28資訊網——每日最新資訊28at.com

示例

<?phprequire __DIR__ . '/vendor/autoload.php';use Revolt/EventLoop;$suspension = EventLoop::getSuspension();$repeatId = EventLoop::repeat(1, function (): void {    print '++ Executing callback created by EventLoop::repeat()' . PHP_EOL;});EventLoop::delay(5, function () use ($suspension, $repeatId): void {    print '++ Executing callback created by EventLoop::delay()' . PHP_EOL;    EventLoop::cancel($repeatId);    $suspension->resume(null);    print '++ Suspension::resume() is async!' . PHP_EOL;});print '++ Suspending to event loop...' . PHP_EOL;$suspension->suspend();print '++ Script end' . PHP_EOL;

在執行上面的例子時,你應該看到這樣的輸出:U9U28資訊網——每日最新資訊28at.com

++ Suspending to event loop...++ Executing callback created by EventLoop::repeat()++ Executing callback created by EventLoop::repeat()++ Executing callback created by EventLoop::repeat()++ Executing callback created by EventLoop::repeat()++ Executing callback created by EventLoop::delay()++ Suspension::resume() is async!++ Script end

這個輸出說明了事件循環內部發生的事情就像它自己獨立的程序一樣。您的腳本將不會繼續通過 $suspension->suspend() 點,除非掛起點通過 $suspension->resume() 或 $suspension->throw() 恢復。U9U28資訊網——每日最新資訊28at.com

雖然一個應用程序可以而且經常幾乎完全在事件循環的范圍內發生,但我們也可以使用事件循環來做一些事情,比如下面的例子,它為交互式控制臺輸入施加了一個短暫的超時:U9U28資訊網——每日最新資訊28at.com

<?phprequire __DIR__ . '/vendor/autoload.php';use Revolt/EventLoop;if (/stream_set_blocking(STDIN, false) !== true) {    /fwrite(STDERR, "Unable to set STDIN to non-blocking" . PHP_EOL);    exit(1);}print "Write something and hit enter" . PHP_EOL;$suspension = EventLoop::getSuspension();$readableId = EventLoop::onReadable(STDIN, function ($id, $stream) use ($suspension): void {    EventLoop::cancel($id);    $chunk = /fread($stream, 8192);    print "Read " . /strlen($chunk) . " bytes" . PHP_EOL;    $suspension->resume(null);});$timeoutId = EventLoop::delay(5, function () use ($readableId, $suspension) {    EventLoop::cancel($readableId);        print "Timeout reached" . PHP_EOL;    $suspension->resume(null);});$suspension->suspend();EventLoop::cancel($readableId);EventLoop::cancel($timeoutId);

顯然,我們可以在這個例子中簡單地同步使用 fgets(STDIN) 。我們只是在演示可以根據需要進出事件循環,以混合同步任務和非阻塞任務。U9U28資訊網——每日最新資訊28at.com

Timers 定時器

事件循環公開了幾種調度計時器的方法。U9U28資訊網——每日最新資訊28at.com

Deferred 回調U9U28資訊網——每日最新資訊28at.com

  • defer() 調度回調在事件循環的下一次迭代中執行。
  • 此方法保證了一個干凈的調用堆棧,以避免循環的當前迭代中其他事件的饑餓。defer()回調總是在事件循環的下一個tick中執行。
  • 在 defer()計時器執行之后,它會被事件循環自動垃圾收集,因此應用程序不需要手動取消關聯的回調。
  • 像所有事件回調一樣,defer() 計時器可以被禁用和重新啟用。如果您在調度它和它實際運行之間禁用此回調,則事件循環將無法對其進行垃圾收集,直到它執行為止。因此,如果 defer() 回調從未真正執行以釋放任何相關資源,則必須手動取消該回調。

案例U9U28資訊網——每日最新資訊28at.com

<?php/** * @author Tinywan(ShaoBo Wan) * @email 756684177@qq.com * @date 2024/1/31 18:24 */require 'vendor/autoload.php';use Revolt/EventLoop;echo "line 1/n";EventLoop::defer(function (): void {    echo "line 3/n";});echo "line 2/n";EventLoop::run();

輸出U9U28資訊網——每日最新資訊28at.com

line 1line 2line 3

Delayed 回調U9U28資訊網——每日最新資訊28at.com

  • delay() 計劃在延遲 n 秒后執行回調
  • delay() 回調在執行后也會被事件循環自動垃圾回收,應用程序不應該手動取消它,除非他們希望在執行前完全放棄回調。
  • 被禁用的 delay() 回調會重置其延遲時間,以便重新啟用后,原始延遲時間再次從零開始。
  • 與 defer() 回調一樣,如果定時器在創建后被應用程序禁用而無法運行,則必須手動取消計劃用于一次性執行的定時器以釋放資源。

案例U9U28資訊網——每日最新資訊28at.com

<?php/** * @author Tinywan(ShaoBo Wan) * @email 756684177@qq.com * @date 2024/1/31 18:24 */require 'vendor/autoload.php';use Revolt/EventLoop;EventLoop::delay(3, function (): void {    print '3 seconds passed';});EventLoop::run();

3秒后輸出U9U28資訊網——每日最新資訊28at.com

3 seconds passed

Periodic 定期回調U9U28資訊網——每日最新資訊28at.com

  • repeat() 調度回調以每 n 秒重復執行一次。
  • 與所有其他事件回調一樣, repeat() 定時器可以隨時禁用/重新啟用。
  • 與 defer() 和 delay() 回調不同, repeat() 回調必須顯式取消以釋放關聯的資源。一旦 repeat() 回調的目的實現,如果不能通過 cancel() 釋放它們,將導致應用程序中的內存泄漏。僅僅禁用 repeat() 回調是不夠的,因為它們的數據只有在取消時才被釋放。

案例U9U28資訊網——每日最新資訊28at.com

<?php/** * @author Tinywan(ShaoBo Wan) * @email 756684177@qq.com * @date 2024/1/31 18:49 */require 'vendor/autoload.php';use Revolt/EventLoop;EventLoop::repeat(0.1, function ($callbackId): void {    static $i = 0;    if ($i++ < 3) {        echo "tick/n";    } else {        EventLoop::cancel($callbackId);    }});EventLoop::run();

輸出U9U28資訊網——每日最新資訊28at.com

tickticktick

定時器偏差U9U28資訊網——每日最新資訊28at.com

重復計時器基本上是簡單的延遲計時器,在觸發適當的處理程序之前會自動重新調度。它們受定時器漂移的影響。多個計時器可能會堆疊在一起,以防它們作為協程執行。U9U28資訊網——每日最新資訊28at.com

Fibers 纖程

Revolt被設計為可以很好地與纖維一起工作。所有事件回調都在單獨的纖程中運行,并且可以隨時掛起它。如果在事件回調中沒有掛起,則纖程將被重用于將來的事件回調以保存資源。U9U28資訊網——每日最新資訊28at.com

掛起允許通過掛起當前執行上下文來等待事件,直到所討論的事件發生。它們將掛起當前纖程并返回到事件循環,或者如果從纖程外部(即從 {main} )調用,則開始運行事件循環。U9U28資訊網——每日最新資訊28at.com

應使用 Revolt/EventLoop/Suspension API暫停和恢復光纖。Suspension 對象可以使用 Revolt/EventLoop::getSuspension() 創建。在獲得 Suspension 對象之后,可以注冊事件回調以調度當前纖程的恢復。$suspension->suspend() 將掛起當前的執行上下文,直到它通過 $suspension->resume() 或 $suspension->throw()恢復。U9U28資訊網——每日最新資訊28at.com

案例:讓我們暫停主執行上下文,直到有數據從 STDIN 讀取或超時到期:U9U28資訊網——每日最新資訊28at.com

<?phprequire __DIR__ . '/vendor/autoload.php';use Revolt/EventLoop;if (/stream_set_blocking(STDIN, false) !== true) {    /fwrite(STDERR, "Unable to set STDIN to non-blocking" . PHP_EOL);    exit(1);}print "Write something and hit enter" . PHP_EOL;$suspension = EventLoop::getSuspension();$readableId = EventLoop::onReadable(STDIN, function ($id, $stream) use ($suspension): void {    EventLoop::cancel($id);    $chunk = /fread($stream, 8192);    print "Read " . /strlen($chunk) . " bytes" . PHP_EOL;    $suspension->resume(null);});$timeoutId = EventLoop::delay(5, function () use ($readableId, $suspension) {    EventLoop::cancel($readableId);        print "Timeout reached" . PHP_EOL;    $suspension->resume(null);});$suspension->suspend();EventLoop::cancel($readableId);EventLoop::cancel($timeoutId);

自動超時輸出U9U28資訊網——每日最新資訊28at.com

Write something and hit enterTimeout reached

按Enter鍵盤輸出U9U28資訊網——每日最新資訊28at.com

Write something and hit enterRead 1 bytes

Signals 信號

信號是類Unix操作系統中的標準化消息。U9U28資訊網——每日最新資訊28at.com

EventLoop::onSignal() 可用于對發送到進程的信號作出反應。U9U28資訊網——每日最新資訊28at.com

<?phprequire __DIR__ . '/vendor/autoload.php';use Revolt/EventLoop;// Let's tick off output once per second, so we can see activity.EventLoop::repeat(1, function (): void {    echo "tick: ", date('c'), "/n";});// What to do when a SIGINT signal is receivedEventLoop::onSignal(SIGINT, function (): void {    echo "Caught SIGINT! exiting .../n";    exit;});EventLoop::run();

SIGINT 信號: 當用戶按某些終端鍵時, 引發終端產生的信號. 如Ctrl+C鍵, 這將產生中斷信號SIGINT. 它將停止一個已失去控制的程序。U9U28資訊網——每日最新資訊28at.com

Ctrl+C 輸出U9U28資訊網——每日最新資訊28at.com

tick: 2024-01-31T11:54:03+00:00tick: 2024-01-31T11:54:04+00:00tick: 2024-01-31T11:54:05+00:00tick: 2024-01-31T11:54:06+00:00tick: 2024-01-31T11:54:07+00:00tick: 2024-01-31T11:54:08+00:00tick: 2024-01-31T11:54:09+00:00tick: 2024-01-31T11:54:10+00:00tick: 2024-01-31T11:54:11+00:00tick: 2024-01-31T11:54:12+00:00^CCaught SIGINT! exiting ...

從基本原理中可以清楚地看到,信號回調可以像任何其他事件回調一樣被啟用、禁用和取消。一般來說,如果所有回調都消失了,只有信號回調仍然存在,那么您希望退出事件循環,除非您沒有主動等待該事件發生。U9U28資訊網——每日最新資訊28at.com

信號號可用性

ext-uv 暴露 UV::SIG* 常量用于可觀察信號。使用 EventDriver 的應用程序在注冊信號回調或依賴 ext-pcntl 時需要手動指定適當的整數信號編號。U9U28資訊網——每日最新資訊28at.com


U9U28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-70393-0.htmlPHP 高性能的事件循環庫 Revolt

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 異步Rust:構建實時消息代理服務器

下一篇: 借助Nacos高效配置與實踐Seata事務的TCC模式

標簽:
  • 熱門焦點
  • 直屏旗艦來了 iQOO 12和K70 Pro同臺競技

    旗艦機基本上使用的都是雙曲面屏幕,這就讓很多喜歡直屏的愛好者在苦等一款直屏旗艦,這次,你們等到了。據博主數碼閑聊站帶來的最新爆料稱,Redmi下代旗艦K70 Pro和iQOO 12兩款手
  • 小米降噪藍牙耳機Necklace分享:聽一首歌 讀懂一個故事

    在今天下午的小米Civi 2新品發布會上,小米還帶來了一款新的降噪藍牙耳機Necklace,我們也在發布結束的第一時間給大家帶來這款耳機的簡單分享。現在大家能見到最多的藍牙耳機
  • 5月安卓手機好評榜:魅族20 Pro奪冠

    性能榜和性價比榜之后,我們來看最后的安卓手機好評榜,數據來源安兔兔評測,收集時間2023年5月1日至5月31日,僅限國內市場。第一名:魅族20 Pro好評率:97.50%不得不感慨魅族老品牌還
  • 十個簡單但很有用的Python裝飾器

    裝飾器(Decorators)是Python中一種強大而靈活的功能,用于修改或增強函數或類的行為。裝飾器本質上是一個函數,它接受另一個函數或類作為參數,并返回一個新的函數或類。它們通常用
  • JavaScript學習 -AES加密算法

    引言在當今數字化時代,前端應用程序扮演著重要角色,用戶的敏感數據經常在前端進行加密和解密操作。然而,這樣的操作在網絡傳輸和存儲中可能會受到惡意攻擊的威脅。為了確保數據
  • 虛擬鍵盤 API 的妙用

    你是否在遇到過這樣的問題:移動設備上有一個固定元素,當激活虛擬鍵盤時,該元素被隱藏在了鍵盤下方?多年來,這一直是 Web 上的默認行為,在本文中,我們將探討這個問題、為什么會發生
  • iQOO 11S屏幕細節公布:首發三星2K E6全感屏 安卓最好的直屏手機

    日前iQOO手機官方宣布,新一代電競旗艦iQOO 11S將會在7月4日19:00正式與大家見面。隨著發布時間的日益臨近,官方關于該機的預熱也更加密集,截至目前已
  • 聯想小新Pad Pro 12.6將要推出,搭載高通驍龍 870 處理器

    聯想小新Pad Pro 12.6將于秋季新品會上推出,官方按照慣例直接在發布會前給出了機型的所有參數。聯想小新 Pad Pro 12.6 將搭載高通驍龍 870 處理器,重量為 5
  • SN570 NVMe SSD固態硬盤 價格與性能兼具

    SN570 NVMe SSD固態硬盤是西部數據發布的最新一代WD Blue系列的固態硬盤,不僅閃存技術更為精進,性能也得到了進一步的躍升。WD Blue SN570 NVMe SSD的包裝外
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
久久精品女人天堂| 欧美亚洲一区| 亚洲人成在线免费观看| 亚洲美女精品一区| 亚洲主播在线播放| 久久精品九九| 欧美不卡视频一区发布| 欧美视频在线观看免费| 国产深夜精品| 91久久国产综合久久91精品网站 | 亚洲精选视频免费看| 亚洲一区二区三区在线播放| 久久精品二区三区| 欧美日本精品| 国产视频一区二区三区在线观看| 影音先锋中文字幕一区| 一区二区精品在线| 久久精品伊人| 欧美日韩国产一区精品一区 | 欧美日韩一区二区视频在线| 国产一区在线视频| 亚洲免费观看高清完整版在线观看| 亚洲欧美激情视频在线观看一区二区三区 | 一区二区三区精品在线 | 久久野战av| 欧美视频中文一区二区三区在线观看 | 国产精品超碰97尤物18| 一区二区三区无毛| 一区二区三区免费看| 久久午夜视频| 国产精品久久久一区二区三区| 亚洲大片一区二区三区| 亚洲综合精品一区二区| 欧美激情乱人伦| 国内一区二区三区| 亚洲一区二区在线看| 欧美成人资源| 国产一区再线| 亚洲专区在线| 欧美日韩国产va另类| 在线成人av| 欧美一区二区视频网站| 欧美特黄一级| 亚洲人成网站999久久久综合| 久久精品亚洲一区二区三区浴池 | 极品日韩av| 午夜国产精品影院在线观看 | 国内偷自视频区视频综合| 亚洲一区二区三区四区视频| 欧美国产国产综合| 在线观看欧美日韩| 久久精品99久久香蕉国产色戒| 国产精品第十页| 亚洲精品综合| 免费中文字幕日韩欧美| 国内外成人免费激情在线视频| 午夜精彩国产免费不卡不顿大片| 欧美日韩一区二区欧美激情| 最新国产成人在线观看| 久久综合婷婷| 狠狠久久五月精品中文字幕| 欧美在线视频二区| 国产精品专区h在线观看| 中文av一区特黄| 欧美日本一区二区三区| 亚洲破处大片| 欧美成人午夜免费视在线看片| 亚洲第一在线综合在线| 久久久久久久久一区二区| 国产网站欧美日韩免费精品在线观看| 亚洲制服av| 国产精品久久久久影院色老大| 亚洲视频高清| 国产精品v亚洲精品v日韩精品 | 亚洲人体偷拍| 欧美电影在线观看| 亚洲日本aⅴ片在线观看香蕉| 免费观看在线综合色| 在线观看一区视频| 麻豆av福利av久久av| 亚洲第一精品影视| 蜜桃久久精品乱码一区二区| 影音先锋久久| 两个人的视频www国产精品| 亚洲国产老妈| 欧美电影免费| 亚洲乱码久久| 欧美日韩在线第一页| 亚洲系列中文字幕| 国产精品视频一区二区高潮| 亚洲欧美在线另类| 国产午夜精品美女毛片视频| 久久精品国产999大香线蕉| 国产一区二区三区久久久| 久久精品首页| 亚洲国产精品传媒在线观看 | 国产精品自在在线| 欧美在线黄色| 一区二区三区在线视频观看| 米奇777在线欧美播放| 亚洲精品国久久99热| 欧美日韩精品高清| 亚洲女人天堂成人av在线| 国产日韩欧美二区| 久久婷婷av| 亚洲精品在线一区二区| 国产精品国产a级| 欧美在线视频a| 在线国产精品一区| 欧美日韩亚洲另类| 欧美一区影院| 亚洲国产成人一区| 欧美日韩国产在线观看| 亚洲欧美成人一区二区三区| 韩国成人理伦片免费播放| 欧美3dxxxxhd| 一区二区三区欧美| 国语自产精品视频在线看抢先版结局| 久久人人九九| av不卡在线观看| 国产亚洲欧美在线| 欧美经典一区二区| 亚洲欧美三级在线| 在线观看视频一区二区| 欧美日韩国产综合一区二区| 亚洲欧洲99久久| 亚洲电影在线| 国产精品久久久久高潮| 久久久精品五月天| 99国内精品久久| 国产视频亚洲| 欧美精品在线免费播放| 性8sex亚洲区入口| 亚洲国产综合在线| 国产精品日韩一区二区三区| 久久伊人一区二区| 亚洲综合精品一区二区| 在线日本高清免费不卡| 国产精品99一区| 乱码第一页成人| 亚洲一区二区欧美日韩| 一区免费观看| 国产精品国色综合久久| 免费久久99精品国产| 亚洲欧美日韩爽爽影院| 国产偷久久久精品专区| 国产精品成人aaaaa网站| 国产亚洲精品久久久| 香蕉免费一区二区三区在线观看 | 国产精品久久久久久久久婷婷| 亚洲午夜一区| 欧美性理论片在线观看片免费| 国产综合久久久久久| 欧美一区二区三区免费观看视频| 国语精品中文字幕| 欧美日韩成人激情| 久久综合伊人77777尤物| 亚洲欧美日韩高清| 国产欧美在线观看| 欧美国产第一页| 久热精品视频在线观看| 欧美在线视频日韩| 亚洲欧美中文日韩v在线观看| 在线午夜精品自拍| 欧美日韩在线播放三区| 亚洲一级片在线看| 欧美激情一区二区三区蜜桃视频| 国产免费一区二区三区香蕉精| 亚洲精品美女在线| 欧美三级中文字幕在线观看| 欧美与黑人午夜性猛交久久久| 国内一区二区三区在线视频| 欧美国产精品v| 欧美亚洲视频在线观看| 亚洲国产黄色| 羞羞色国产精品| 国产视频一区二区三区在线观看| 午夜视频精品| 亚洲一区二区在线观看视频| 洋洋av久久久久久久一区| 国产欧美精品在线播放| 欧美精品在线视频| 欧美xart系列在线观看| 久久成人综合网| 销魂美女一区二区三区视频在线| 亚洲乱码国产乱码精品精| 亚洲国产午夜| 国产专区综合网| 国产精品久久久久久av福利软件| 一区二区三区四区五区精品| 欧美日韩国产一区二区| 欧美电影资源| 欧美**人妖| 久久久久久久久久久成人| 欧美一区二区三区啪啪| 亚洲欧美日韩直播| 一区二区三区四区五区视频| 一个色综合导航| 在线日韩成人| 国产精品美女999| 免费高清在线一区| 欧美在线精品一区| 久久精品男女| 欧美成人自拍|