Sobes.tech
Middle

Go-догу контексттин колдонуу учурлары жөнүндө айтып бер.

sobes.tech AI

AIден жооп

Go-дөгү контекст колдонулушу суранычтардын жашоо циклин башкаруу жана горутиндердин аткарылышын көзөмөлдөө үчүн колдонулат. Негизги колдонуу учурлары:

  • Болтуртуу: Белгилүү бир суроо менен байланышкан горутиндердин чынжырын болтурганга мүмкүндүк берет. Мисалы, байланышты жабуу же убакыттын өтүшү учурунда.
  • Убакыт чеги: Операциянын аяктай турган акыркы мөөнөтүн белгилейт. Эгер операция убакытта аяктабаса, контекст болтурулат. Бул чексиз күтүүнү алдын алат.
  • Өзгөчө маалыматтарды өткөрүү: Белгилүү бир суроо менен байланышкан маалыматтарды (мисалы, колдонуучунун ID, трассировка идентификатору) функциялардын чынжырында өзгөртүүсүз өткөрүүгө мүмкүндүк берет.

Колдонуу мисалдары:

  1. Белгилүү бир сигнал аркылуу болтуртуу:

    пакет main
    
    import (
    	"context"
    	"fmt"
    	"time"
    )
    
    функция worker(ctx context.Context, id int) {
    	бо {
    		издөө {
    		случай <-ctx.Done():
    			fmt.Printf("Жумушчу %d үзүлдү\n", id)
    			кайтуу
    		default:
    			fmt.Printf("Жумушчу %d иштеп жатат...\n", id)
    			time.Sleep(500 * time.Millisecond)
    		}
    	}
    }
    
    функция main() {
    	ctx, cancel := context.WithCancel(context.Background())
    	defer cancel() // Болтуртууну камсыз кылуу
    
    	го worker(ctx, 1)
    	го worker(ctx, 2)
    
    	time.Sleep(2 * time.Second)
    	cancel() // Контекстти болтуртуу
    
    	time.Sleep(500 * time.Millisecond) // Горутиндердин аяктоо үчүн убакыт берүү
    }
    
  2. Убакыт чеги:

    пакет main
    
    import (
    	"context"
    	"fmt"
    	"time"
    )
    
    функция longOperation(ctx context.Context) error {
    	издөө {
    	случай <-time.After(3 * time.Second): // Узак иштөө моделдөө
    		fmt.Println("Операция ийгиликтүү аяктады")
    		return nil
    	случай <-ctx.Done():
    		fmt.Println("Операция болтурду контекст аркылуу:", ctx.Err())
    		return ctx.Err()
    	}
    }
    
    функция main() {
    	ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
    	defer cancel()
    
    	err := longOperation(ctx)
    	эгер err != nil {
    		fmt.Println("Каталар:", err)
    	}
    }
    
  3. Маалыматтарды өткөрүү:

    пакет main
    
    import (
    	"context"
    	"fmt"
    )
    
    type UserKey string
    
    const userIDKey UserKey = "userID"
    
    func processRequest(ctx context.Context) {
    	userID := ctx.Value(userIDKey).(int)
    	fmt.Printf("Суранычты иштетүү үчүн колдонуучу ID: %d\n", userID)
    	// Кийинки иштетүү userID менен
    }
    
    func main() {
    	ctx := context.WithValue(context.Background(), userIDKey, 123)
    	processRequest(ctx)
    }