Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Hantarkan salinan konteks coroutine utama kepada konteks subrutin

Hantarkan salinan konteks coroutine utama kepada konteks subrutin

WBOY
WBOYke hadapan
2024-02-09 23:30:09601semak imbas

Hantarkan salinan konteks coroutine utama kepada konteks subrutin

Dalam PHP, coroutine ialah alat pengaturcaraan berkuasa yang boleh meningkatkan kecekapan pelaksanaan kod. Dalam coroutine, adalah operasi biasa untuk menghantar salinan konteks coroutine utama kepada konteks subrutin. Dengan cara ini, data konteks coroutine utama boleh diakses dalam subrutin untuk merealisasikan perkongsian dan pemindahan data. Proses ini sangat mudah dalam PHP, dan anda hanya perlu menggunakan kata kunci hasil. Dalam artikel ini, kami akan memperkenalkan kepada anda secara terperinci cara menghantar salinan konteks coroutine utama kepada konteks subrutin dan memberi anda beberapa contoh kod untuk membantu anda memahami dan menggunakan ciri ini dengan lebih baik.

Kandungan soalan

Saya mempunyai titik akhir API golang dan konteks yang berkaitan dengannya.

Titik akhir perlu melakukan beberapa pengangkatan berat di belakang tabir, jadi saya mencipta subrutin baharu di dalam titik akhir utama dan mengembalikan respons itu sendiri.

Untuk mengendalikan pembatalan konteks, saya mencipta konteks latar belakang dan menyerahkannya kepada subrutin sebagai konteks baharu.

Masalahnya ialah dengan melakukan ini, ya saya boleh melaksanakan subrutin latar belakang, tetapi nilai dalam konteks utama seperti ID permintaan, ID span, dll. (kebanyakan kunci yang saya tidak tahu) yang digunakan untuk mengesan akan hilang.

Cara menghantar konteks ibu bapa kepada rutin kanak-kanak tanpa membatalkan pelaksanaan walaupun selepas respons dihantar kepada pelanggan.

Edit

Saya tidak menyampaikan apa-apa nilai ke dalam konteks. Tetapi pada mulanya kami menghantar request-id, span-id, dsb. yang diperlukan untuk penjejakan. Maklumat ini semuanya dalam konteks. Ini ialah perpustakaan dalaman dan konteksnya adalah tempat kami menyimpannya.

Saya tahu ini adalah anti-corak nilai lulus menggunakan konteks, tiada nilai akan diluluskan kecuali ID permintaan dan nilai lain yang penting kepada perpustakaan dan bukan logik perniagaan

Penyelesaian

Apabila anda membatalkan konteks induk, alih keluar daripadanya Semua konteks terbitan juga akan dibatalkan. Jadi anda betul untuk mencipta konteks baharu untuk goroutine yang dijana oleh pengendali permintaan.

Apabila anda mencipta konteks baharu, anda harus menyalin semua nilai yang anda minati daripada konteks asal kepada konteks baharu. Walau bagaimanapun, anda mengatakan anda tidak tahu semua kunci. Oleh itu, anda masih boleh menyimpan rujukan kepada konteks induk supaya ia boleh disoal nilainya. Perkara seperti ini:

type nestedContext struct {
   context.Context
   parent context.Context
}

func (n nestedContext)  Value(key any) any {
   return n.parent.Value(key)
}

...
newContext := nestedContext{
   Context:context.Background(),
   parent: parentContext,
}

Ini akan mencipta konteks baharu daripada context.background() yang akan mencari nilai daripada konteks induk yang dibatalkan.

Lulus newcontext sebagai konteks kepada goroutine yang dicipta daripada pengendali.

Atas ialah kandungan terperinci Hantarkan salinan konteks coroutine utama kepada konteks subrutin. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam