کتابخانه‌ی استاندارد · زمان و هم‌زمانی

رویدادها events

انتشاردهنده رویداد درون برنامه: موضوع‌های نقطه‌دار با علامت جایگزین، کنشگر یک‌بار مصرف و نخ کارگر اختیاری.

واردسازی رویدادها

رویدادها یک مرکز ساده انتشار و اشتراک درون یک برنامه است. روی یک موضوع کنشگر ثبت می‌کنید و انتشار همه کنشگرهایی را که موضوعشان می‌خواند صدا می‌زند. نوع داده یک پارامتر است، پس هر انتشاردهنده یک نوع داده می‌برد: انتشاردهنده<صحیح>، انتشاردهنده<رشته> یا انتشاردهنده‌ای از ساختار خودتان.

موضوع‌ها واژه‌هایی هستند که با نقطه جدا شده‌اند، مثل user.login. در موضوع کنشگر، * دقیقاً یک واژه و # باقی موضوع را، حتی اگر چیزی نمانده باشد، می‌پذیرد. پس user.* با user.login می‌خواند ولی با user.a.b نه، و order.# با order و order.new و order.new.eu می‌خواند.

چند نکته:

  • کنشگر یک لامبدا است و لامبدا متغیرهای اطرافش را با مقدار می‌گیرد. وضعیت مشترک را با اشاره‌گر، مجموعه روی پشته یا متغیر سراسری ناپایا نگه دارید، مثل مثال‌ها.
  • کنشگرها بیرون از قفل اجرا می‌شوند، پس یک کنشگر می‌تواند روی همان انتشاردهنده روی، خاموش یا انتشار را صدا بزند. کنشگری که در میان انتشار اضافه شود از رویداد بعدی به بعد را می‌بیند.
  • روی یک شناسه برمی‌گرداند و خاموش همان شناسه را می‌گیرد. تابع‌ها با هم مقایسه نمی‌شوند.
  • انتشاردهنده ناهمگام رویدادها را روی نخی که خودتان می‌دهید انجام می‌دهد. جدید ناهمگام فقط صف را می‌سازد و نخی شروع نمی‌کند؛ پردازش صف را روی یک نخ خودتان اجرا کنید تا کنشگرها یکی‌یکی و به ترتیب ورود به صف اجرا شوند. تخلیه صبر می‌کند تا صف خالی شود و آخرین کنشگر برگردد؛ هرگز آن را از درون کنشگر صدا نزنید.
  • انتشاردهنده را با آزادکن آزاد کنید. برای ناهمگام، اول بستن را صدا بزنید و به نخی که پردازش صف را اجرا می‌کند بپیوندید، چون آزادکن منتظر آن نمی‌ماند.

ثبت، انتشار، برداشتن

روی و یک‌بار یک موضوع و یک کنشگر می‌گیرند. روی همه همه رویدادها را می‌گیرد. انتشار می‌گوید چند کنشگر صدا زده شد.

events-basic.salam
واردسازی رویدادها

ناپایا e := رویدادها.جدید() برگردان رویدادها.انتشاردهنده<صحیح>
ناپایا log := وکتور {} برگردان وکتور<رشته>

تابع note(s: رشته):
    log.بیفزا(s)
پایان

تابع ریشه:
    e = رویدادها.جدید() برگردان رویدادها.انتشاردهنده<صحیح>
    a := رویدادها.روی(e، "user.login"، (ev: رویدادها.رویداد<صحیح>): note("a " + ev.موضوع + " " + ev.داده) پایان)
    b := رویدادها.روی(e، "user.*"، (ev: رویدادها.رویداد<صحیح>): note("b " + ev.موضوع + " " + ev.داده) پایان)
    _c := رویدادها.یک‌بار(e، "user.login"، (ev: رویدادها.رویداد<صحیح>): note("once " + ev.داده) پایان)
    _d := رویدادها.روی همه(e، (ev: رویدادها.رویداد<صحیح>): note("any " + ev.موضوع) پایان)
    _f := رویدادها.روی(e، "order.#"، (ev: رویدادها.رویداد<صحیح>): note("order " + ev.موضوع) پایان)

    سرچاپ "count login"، رویدادها.شمار(e، "user.login")
    سرچاپ "count user.a.b"، رویدادها.شمار(e، "user.a.b")
    سرچاپ "count order"، رویدادها.شمار(e، "order")
    سرچاپ "count order.x.y"، رویدادها.شمار(e، "order.x.y")
    سرچاپ "calls"، رویدادها.انتشار(e، "user.login"، 1)
    سرچاپ "calls"، رویدادها.انتشار(e، "user.login"، 2)
    سرچاپ "calls"، رویدادها.انتشار(e، "user.logout"، 3)
    سرچاپ "calls"، رویدادها.انتشار(e، "order.new.eu"، 4)
    سرچاپ "calls"، رویدادها.انتشار(e، "other"، 5)

    سرچاپ "off a"، رویدادها.خاموش(e، a)
    سرچاپ "off a again"، رویدادها.خاموش(e، a)
    سرچاپ "off topic"، رویدادها.خاموش موضوع(e، "user.*")
    سرچاپ "off b"، رویدادها.خاموش(e، b)
    سرچاپ "len"، رویدادها.تعداد(e)
    سرچاپ "calls"، رویدادها.انتشار(e، "user.login"، 6)

    selfoff := رویدادها.روی(e، "x"، (ev: رویدادها.رویداد<صحیح>): note("x " + ev.داده) پایان)
    _adder := رویدادها.روی(e، "x"، (_ev: رویدادها.رویداد<صحیح>):
        _id := رویدادها.روی(e، "y"، (_v: رویدادها.رویداد<صحیح>): note("y") پایان)
        _ok := رویدادها.خاموش(e، selfoff)
    پایان)
    سرچاپ "len before"، رویدادها.تعداد(e)
    رویدادها.انتشار(e، "x"، 7)
    سرچاپ "len after"، رویدادها.تعداد(e)
    رویدادها.انتشار(e، "x"، 8)

    تکرار log.طول() در i:
        سرچاپ log.بگیر(i)
    پایان
    log.آزادکن()
    رویدادها.آزادکن(e)
    برگشت 0
پایان
خروجیcount login 4 count user.a.b 1 count order 2 count order.x.y 2 calls 4 calls 3 calls 2 calls 2 calls 1 off a true off a again false off topic 1 off b false len 2 calls 1 len before 4 len after 4 a user.login 1 b user.login 1 once 1 any user.login a user.login 2 b user.login 2 any user.login b user.logout 3 any user.logout any order.new.eu order order.new.eu any other any user.login any x x 7 any x

رویدادها روی نخ کارگر

جدید ناهمگام صفی با اندازه داده‌شده می‌سازد و پردازش صف که روی نخ خودتان اجرا می‌شود کارگر آن است. انتشار ناهمگام رویداد را در صف می‌گذارد و فوراً برمی‌گردد و فقط وقتی صف پر باشد صبر می‌کند. بستن پذیرش را قطع می‌کند؛ پردازش صف آنچه را در صف است تمام می‌کند و برمی‌گردد، پس بعد از آن به نخ بپیوندید.

events-async.salam
واردسازی رویدادها
واردسازی حافظه

ناپایا total := 0
ناپایا last := 0
ناپایا ordered := درست
ناپایا seen := 0

تابع add(ev: رویدادها.رویداد<صحیح>):
    total = total + ev.داده
    اگر ev.داده نابرابر last + 1:
        ordered = نادرست
    پایان
    last = ev.داده
    seen = seen + 1
پایان

تابع worker(p: رویدادها.انتشاردهنده<صحیح>*):
    رویدادها.پردازش صف(p[0])
پایان

تابع ریشه:
    e := رویدادها.جدید ناهمگام(4) برگردان رویدادها.انتشاردهنده<صحیح>
    box := حافظه.تخصیص صفرشده(اندازه‌گونه(رویدادها.انتشاردهنده<صحیح>) برگردان طبیعی۶۴) برگردان رویدادها.انتشاردهنده<صحیح>*
    box[0] = e
    th := نخ‌ساز(worker، box)
    _id := رویدادها.روی(e، "tick"، (ev: رویدادها.رویداد<صحیح>): add(ev) پایان)

    سرچاپ "first queued"، رویدادها.انتشار ناهمگام(e، "tick"، 1)
    تکرار 2 تا 200 در i:
        _ok := رویدادها.انتشار ناهمگام(e، "tick"، i)
    پایان
    رویدادها.تخلیه(e)
    سرچاپ "seen"، seen
    سرچاپ "total"، total
    سرچاپ "ordered"، ordered
    سرچاپ "pending"، رویدادها.در انتظار(e)

    _ok := رویدادها.انتشار ناهمگام(e، "tick"، 201)
    _ok2 := رویدادها.انتشار ناهمگام(e، "other"، 999)
    رویدادها.بستن(e)
    نخ‌پیوند(th)
    سرچاپ "after close seen"، seen
    سرچاپ "total"، total
    سرچاپ "emit after close"، رویدادها.انتشار ناهمگام(e، "tick"، 5)
    رویدادها.بستن(e)

    plain := رویدادها.جدید() برگردان رویدادها.انتشاردهنده<صحیح>
    سرچاپ "async on sync emitter"، رویدادها.انتشار ناهمگام(plain، "x"، 1)
    رویدادها.آزادکن(plain)
    رویدادها.آزادکن(e)
    حافظه.آزادسازی(box برگردان تهی*)
    برگشت 0
پایان
خروجیfirst queued true seen 200 total 20100 ordered true pending 0 after close seen 201 total 20301 emit after close false async on sync emitter false

ساختار به‌عنوان داده

نوع داده پارامتر است، پس یک ساختار مثل یک عدد جابه‌جا می‌شود: Emitter<Order> یک Order کامل را در ev.داده به هر دستگیره می‌دهد. روی همه همه موضوع‌ها را می‌بیند، حتی آن‌هایی که کس دیگری به آن‌ها گوش نمی‌دهد، و جای خوبی برای شمارنده ممیزی یا یک خط گزارش است. انتشار تعداد دستگیره‌های اجراشده را برمی‌گرداند، پس order.shipped در مثال زیر ۱ می‌دهد (فقط دستگیره ممیزی).

events-guide-payload.salam
واردسازی رویدادها

ناپایا revenue := 0
ناپایا audited := 0

ساختار Order:
    همگانی id: صحیح = 0
    همگانی item: رشته = ""
    همگانی qty: صحیح = 0
پایان

تابع ریشه:
    bus := رویدادها.جدید() برگردان رویدادها.انتشاردهنده<Order>
    _a := رویدادها.روی(bus، "order.paid"، (ev: رویدادها.رویداد<Order>):
        revenue += ev.داده.qty * 10
        سرچاپ "paid"، ev.داده.id، ev.داده.item
    پایان)
    _b := رویدادها.روی(bus، "order.cancelled"، (ev: رویدادها.رویداد<Order>):
        سرچاپ "cancelled"، ev.داده.id
    پایان)
    _c := رویدادها.روی همه(bus، (_ev: رویدادها.رویداد<Order>): audited += 1 پایان)

    سرچاپ رویدادها.انتشار(bus، "order.paid"، Order { id = 1، item = "tea"، qty = 3 })
    سرچاپ رویدادها.انتشار(bus، "order.cancelled"، Order { id = 2 })
    سرچاپ رویدادها.انتشار(bus، "order.shipped"، Order { id = 1 })
    سرچاپ "revenue"، revenue، "audited"، audited
    رویدادها.آزادکن(bus)
پایان
خروجیpaid 1 tea 2 cancelled 2 2 1 revenue 30 audited 3

انتشار از داخل دستگیره

دستگیره‌ها بیرون از قفل انتشاردهنده اجرا می‌شوند، پس دستگیره می‌تواند دوباره روی همان انتشاردهنده منتشر کند. انتشار تودرتو دستگیره‌هایش را همان لحظه و پیش از بازگشت دستگیره بیرونی اجرا می‌کند و انتشار بیرونی همچنان فقط دستگیره‌های خودش را می‌شمارد. این زنجیره‌ها را کوتاه نگه دارید و مطمئن شوید تمام می‌شوند، چون چیزی جلوی دستگیره‌ای را که بی‌قید‌وشرط موضوع خودش را منتشر می‌کند نمی‌گیرد.

events-guide-cascade.salam
واردسازی رویدادها

ناپایا bus := رویدادها.جدید() برگردان رویدادها.انتشاردهنده<صحیح>
ناپایا depth := 0

تابع ریشه:
    bus = رویدادها.جدید() برگردان رویدادها.انتشاردهنده<صحیح>
    _a := رویدادها.روی(bus، "count"، (ev: رویدادها.رویداد<صحیح>):
        سرچاپ "count"، ev.داده
        اگر ev.داده < 3:
            depth += 1
            _n := رویدادها.انتشار(bus، "count"، ev.داده + 1)
        پایان
    پایان)
    _b := رویدادها.روی(bus، "count"، (ev: رویدادها.رویداد<صحیح>):
        اگر ev.داده == 3:
            _n := رویدادها.انتشار(bus، "done"، ev.داده)
        پایان
    پایان)
    _c := رویدادها.روی(bus، "done"، (ev: رویدادها.رویداد<صحیح>): سرچاپ "done at"، ev.داده پایان)

    سرچاپ "handlers called"، رویدادها.انتشار(bus، "count"، 1)
    سرچاپ "nested emits"، depth
    رویدادها.آزادکن(bus)
پایان
خروجیcount 1 count 2 count 3 done at 3 handlers called 2 nested emits 2

برداشتن دستگیره‌های یک بخش

بخشی که دستگیره ثبت می‌کند باید شناسه‌ها را نگه دارد و هنگام رفتن پس بدهد، وگرنه انتشاردهنده کدی را صدا می‌زند که دیگر قرار نیست اجرا شود. خاموش یک شناسه می‌گیرد و تعداد پس از پاکسازی راه ساده‌ای برای اطمینان از این است که چیزی جا نمانده. انتشار موضوعی که دستگیره ندارد خطا نیست و فقط ۰ برمی‌گرداند.

events-guide-teardown.salam
واردسازی رویدادها

ناپایا clicks := 0

ساختار Panel:
    همگانی ids: وکتور<صحیح> = وکتور {}
پایان

تابع openPanel(bus: رویدادها.انتشاردهنده<رشته>): Panel:
    ناپایا p := Panel {}
    p.ids.بیفزا(رویدادها.روی(bus، "ui.click"، (_ev: رویدادها.رویداد<رشته>): clicks += 1 پایان))
    p.ids.بیفزا(رویدادها.روی(bus، "ui.key.*"، (_ev: رویدادها.رویداد<رشته>): clicks += 10 پایان))
    برگشت p
پایان

تابع closePanel(bus: رویدادها.انتشاردهنده<رشته>، p: Panel):
    هر id در p.ids:
        _ok := رویدادها.خاموش(bus، id)
    پایان
    p.ids.آزادکن()
پایان

تابع ریشه:
    bus := رویدادها.جدید() برگردان رویدادها.انتشاردهنده<رشته>
    p := openPanel(bus)
    سرچاپ "open"، رویدادها.تعداد(bus)، رویدادها.انتشار(bus، "ui.click"، "a")، رویدادها.انتشار(bus، "ui.key.enter"، "b")
    closePanel(bus، p)
    سرچاپ "closed"، رویدادها.تعداد(bus)، رویدادها.انتشار(bus، "ui.click"، "c")
    سرچاپ "clicks"، clicks
    رویدادها.آزادکن(bus)
پایان
خروجیopen 2 1 1 closed 0 0 clicks 11

گونه‌ها

رویداد Event

ساختار رویداد<T>
یک رویداد: موضوعی که روی آن منتشر شد و داده‌اش.
نامانگلیسیگونهتوضیح
موضوعtopicرشته = ""موضوع کامل، مثل user.login.
دادهdataTداده‌ای که به Emit داده شد.

کنشگر Handler

ساختار کنشگر<T>
یک کنشگر ثبت‌شده با شناسه، الگوی موضوع و تابعش.
نامانگلیسیگونهتوضیح
شناسهidصحیح = 0شناسه‌ای که On برگرداند.
الگوpatternرشته = ""الگوی موضوعی که کنشگر با آن ثبت شد.
یک بارonceمنطقی = نادرستکنشگر بعد از نخستین فراخوانی برداشته می‌شود.
تابعcbتابع(رویداد)تابعی که با رویداد صدا زده می‌شود.

انتشاردهنده Emitter

ساختار انتشاردهنده<T>
یک انتشاردهنده. نسخه‌های آن کنشگرها و صف مشترک دارند.
نامانگلیسیگونهتوضیح
کنشگرهاhsکنشگر*جدول کنشگرها.
قفلmusync.Mutexقفل جدول و صف.
وضعیت درونیctlصحیح۶۴*شمارنده‌ها و پرچم‌های صف.
ناهمگامasyncمنطقی = نادرستانتشاردهنده صف دارد، پس به نخی نیاز دارد که پردازش صف را اجرا کند.
صفqbufرویداد*صف رویدادهایی که منتظر کارگرند.
شرطcvsync.CondVarشرطی که کارگر و منتظرها را بیدار می‌کند.

تابع‌ها

جدید New

تابع جدید<T>(): انتشاردهنده<T>
یک انتشاردهنده هم‌گام می‌سازد؛ Emit کنشگرها را روی نخ فراخواننده صدا می‌زند.
events-Basic.salam
واردسازی رویدادها

ناپایا e := رویدادها.جدید() برگردان رویدادها.انتشاردهنده<صحیح>
ناپایا log := وکتور {} برگردان وکتور<رشته>

تابع note(s: رشته):
    log.بیفزا(s)
پایان

تابع ریشه:
    e = رویدادها.جدید() برگردان رویدادها.انتشاردهنده<صحیح>
    a := رویدادها.روی(e، "user.login"، (ev: رویدادها.رویداد<صحیح>): note("a " + ev.موضوع + " " + ev.داده) پایان)
    b := رویدادها.روی(e، "user.*"، (ev: رویدادها.رویداد<صحیح>): note("b " + ev.موضوع + " " + ev.داده) پایان)
    _c := رویدادها.یک‌بار(e، "user.login"، (ev: رویدادها.رویداد<صحیح>): note("once " + ev.داده) پایان)
    _d := رویدادها.روی همه(e، (ev: رویدادها.رویداد<صحیح>): note("any " + ev.موضوع) پایان)
    _f := رویدادها.روی(e، "order.#"، (ev: رویدادها.رویداد<صحیح>): note("order " + ev.موضوع) پایان)

    سرچاپ "count login"، رویدادها.شمار(e، "user.login")
    سرچاپ "count user.a.b"، رویدادها.شمار(e، "user.a.b")
    سرچاپ "count order"، رویدادها.شمار(e، "order")
    سرچاپ "count order.x.y"، رویدادها.شمار(e، "order.x.y")
    سرچاپ "calls"، رویدادها.انتشار(e، "user.login"، 1)
    سرچاپ "calls"، رویدادها.انتشار(e، "user.login"، 2)
    سرچاپ "calls"، رویدادها.انتشار(e، "user.logout"، 3)
    سرچاپ "calls"، رویدادها.انتشار(e، "order.new.eu"، 4)
    سرچاپ "calls"، رویدادها.انتشار(e، "other"، 5)

    سرچاپ "off a"، رویدادها.خاموش(e، a)
    سرچاپ "off a again"، رویدادها.خاموش(e، a)
    سرچاپ "off topic"، رویدادها.خاموش موضوع(e، "user.*")
    سرچاپ "off b"، رویدادها.خاموش(e، b)
    سرچاپ "len"، رویدادها.تعداد(e)
    سرچاپ "calls"، رویدادها.انتشار(e، "user.login"، 6)

    selfoff := رویدادها.روی(e، "x"، (ev: رویدادها.رویداد<صحیح>): note("x " + ev.داده) پایان)
    _adder := رویدادها.روی(e، "x"، (_ev: رویدادها.رویداد<صحیح>):
        _id := رویدادها.روی(e، "y"، (_v: رویدادها.رویداد<صحیح>): note("y") پایان)
        _ok := رویدادها.خاموش(e، selfoff)
    پایان)
    سرچاپ "len before"، رویدادها.تعداد(e)
    رویدادها.انتشار(e، "x"، 7)
    سرچاپ "len after"، رویدادها.تعداد(e)
    رویدادها.انتشار(e، "x"، 8)

    تکرار log.طول() در i:
        سرچاپ log.بگیر(i)
    پایان
    log.آزادکن()
    رویدادها.آزادکن(e)
    برگشت 0
پایان
خروجیcount login 4 count user.a.b 1 count order 2 count order.x.y 2 calls 4 calls 3 calls 2 calls 2 calls 1 off a true off a again false off topic 1 off b false len 2 calls 1 len before 4 len after 4 a user.login 1 b user.login 1 once 1 any user.login a user.login 2 b user.login 2 any user.login b user.logout 3 any user.logout any order.new.eu order order.new.eu any other any user.login any x x 7 any x

روی On

تابع روی<T>(e: انتشاردهنده<T>، pattern: رشته، cb: تابع(رویداد<T>)): صحیح
برای یک الگوی موضوع کنشگر ثبت می‌کند و شناسه‌اش را برمی‌گرداند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: events-Basic.salam

یک‌بار Once

تابع یک‌بار<T>(e: انتشاردهنده<T>، pattern: رشته، cb: تابع(رویداد<T>)): صحیح
کنشگری ثبت می‌کند که یک بار صدا زده و سپس برداشته می‌شود.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: events-Basic.salam

روی همه OnAny

تابع روی همه<T>(e: انتشاردهنده<T>، cb: تابع(رویداد<T>)): صحیح
برای همه موضوع‌ها کنشگر ثبت می‌کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: events-Basic.salam

خاموش Off

تابع خاموش<T>(e: انتشاردهنده<T>، id: صحیح): منطقی
کنشگر با این شناسه را برمی‌دارد؛ اگر نبود نادرست برمی‌گرداند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: events-Basic.salam

خاموش موضوع OffTopic

تابع خاموش موضوع<T>(e: انتشاردهنده<T>، pattern: رشته): صحیح
همه کنشگرهایی را که دقیقاً با این الگو ثبت شده‌اند برمی‌دارد و شمارشان را برمی‌گرداند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: events-Basic.salam

شمار Count

تابع شمار<T>(e: انتشاردهنده<T>، topic: رشته): صحیح
شمار کنشگرهایی که رویدادی روی این موضوع را می‌گیرند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: events-Basic.salam

تعداد Len

تابع تعداد<T>(e: انتشاردهنده<T>): صحیح
شمار کنشگرهای ثبت‌شده.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: events-Basic.salam

انتشار Emit

تابع انتشار<T>(e: انتشاردهنده<T>، topic: رشته، data: T): صحیح
کنشگرهای هم‌خوان را همین حالا به ترتیب افزودن صدا می‌زند و شمارشان را برمی‌گرداند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: events-Basic.salam

جدید ناهمگام NewAsync

تابع جدید ناهمگام<T>(capacity: صحیح): انتشاردهنده<T>
انتشاردهنده‌ای با صفی به این اندازه می‌سازد. نخی شروع نمی‌کند: پردازش صف را روی نخ خودتان اجرا کنید.
events-Async.salam
واردسازی رویدادها
واردسازی حافظه

ناپایا total := 0
ناپایا last := 0
ناپایا ordered := درست
ناپایا seen := 0

تابع add(ev: رویدادها.رویداد<صحیح>):
    total = total + ev.داده
    اگر ev.داده نابرابر last + 1:
        ordered = نادرست
    پایان
    last = ev.داده
    seen = seen + 1
پایان

تابع worker(p: رویدادها.انتشاردهنده<صحیح>*):
    رویدادها.پردازش صف(p[0])
پایان

تابع ریشه:
    e := رویدادها.جدید ناهمگام(4) برگردان رویدادها.انتشاردهنده<صحیح>
    box := حافظه.تخصیص صفرشده(اندازه‌گونه(رویدادها.انتشاردهنده<صحیح>) برگردان طبیعی۶۴) برگردان رویدادها.انتشاردهنده<صحیح>*
    box[0] = e
    th := نخ‌ساز(worker، box)
    _id := رویدادها.روی(e، "tick"، (ev: رویدادها.رویداد<صحیح>): add(ev) پایان)

    سرچاپ "first queued"، رویدادها.انتشار ناهمگام(e، "tick"، 1)
    تکرار 2 تا 200 در i:
        _ok := رویدادها.انتشار ناهمگام(e، "tick"، i)
    پایان
    رویدادها.تخلیه(e)
    سرچاپ "seen"، seen
    سرچاپ "total"، total
    سرچاپ "ordered"، ordered
    سرچاپ "pending"، رویدادها.در انتظار(e)

    _ok := رویدادها.انتشار ناهمگام(e، "tick"، 201)
    _ok2 := رویدادها.انتشار ناهمگام(e، "other"، 999)
    رویدادها.بستن(e)
    نخ‌پیوند(th)
    سرچاپ "after close seen"، seen
    سرچاپ "total"، total
    سرچاپ "emit after close"، رویدادها.انتشار ناهمگام(e، "tick"، 5)
    رویدادها.بستن(e)

    plain := رویدادها.جدید() برگردان رویدادها.انتشاردهنده<صحیح>
    سرچاپ "async on sync emitter"، رویدادها.انتشار ناهمگام(plain، "x"، 1)
    رویدادها.آزادکن(plain)
    رویدادها.آزادکن(e)
    حافظه.آزادسازی(box برگردان تهی*)
    برگشت 0
پایان
خروجیfirst queued true seen 200 total 20100 ordered true pending 0 after close seen 201 total 20301 emit after close false async on sync emitter false

انتشار ناهمگام EmitAsync

تابع انتشار ناهمگام<T>(e: انتشاردهنده<T>، topic: رشته، data: T): منطقی
رویداد را برای کارگر در صف می‌گذارد؛ اگر انتشاردهنده بسته یا ناهمگام نباشد نادرست است.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: events-Async.salam

در انتظار Pending

تابع در انتظار<T>(e: انتشاردهنده<T>): صحیح
شمار رویدادهای صف که هنوز انجام نشده‌اند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: events-Async.salam

تخلیه Flush

تابع تخلیه<T>(e: انتشاردهنده<T>)
صبر می‌کند تا همه رویدادهای صف انجام شوند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: events-Async.salam

پردازش صف Drain

تابع پردازش صف<T>(e: انتشاردهنده<T>)
حلقه کارگر انتشاردهنده ناهمگام: رویدادهای صف را یکی‌یکی انجام می‌دهد و وقتی انتشاردهنده بسته و صف خالی شد برمی‌گردد. آن را روی نخ جداگانه صدا بزنید.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: events-Async.salam

بستن Close

تابع بستن<T>(e: انتشاردهنده<T>)
پذیرش را قطع می‌کند؛ سپس پردازش صف صف را تمام می‌کند و برمی‌گردد. دوبار صدا زدنش بی‌خطر است.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: events-Async.salam

آزادکن Free

تابع آزادکن<T>(e: انتشاردهنده<T>)
انتشاردهنده را می‌بندد و حافظه‌اش را آزاد می‌کند. اول به نخی که پردازش صف را اجرا می‌کند بپیوندید.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: events-Async.salam