Rumah pembangunan bahagian belakang Golang Bagaimana untuk menyediakan ipc di golang

Bagaimana untuk menyediakan ipc di golang

Apr 24, 2023 am 09:10 AM

Golang ialah bahasa pengaturcaraan yang cekap, pantas dan boleh dipercayai yang sering digunakan untuk pembangunan aplikasi berprestasi tinggi. Pada masa yang sama, Golang juga mempunyai sokongan terbina dalam untuk IPC (komunikasi antara proses), yang boleh digunakan untuk komunikasi antara proses. Dalam artikel ini, kami akan memperkenalkan pengetahuan asas tentang cara menyediakan IPC di Golang, dan menggunakan beberapa contoh untuk membantu pembaca memahami IPC dengan lebih baik.

Apakah IPC?

IPC ialah kaedah komunikasi antara dua atau lebih proses. IPC ialah cara yang berbeza untuk berkomunikasi antara utas atau proses yang berjalan dalam satu proses. IPC boleh digunakan untuk berkongsi data secara tempatan atau jauh, serentak atau tak segerak. Dalam sistem pengendalian, IPC biasanya melibatkan memori yang dikongsi, penghantaran mesej, paip, isyarat, dll.

Apakah IPC yang disokong oleh Golang?

Golang menyediakan beberapa kaedah IPC, termasuk memori dikongsi, berasaskan saluran dan komunikasi isyarat proses. Kaedah ini mempunyai kelebihan, kelemahan dan skop penggunaannya sendiri.

Bagaimana untuk menyediakan IPC menggunakan Golang?

Di Golang, kita boleh menggunakan panggilan sistem (syscall) untuk menetapkan IPC. Berikut ialah kod sampel yang menggunakan fungsi syscall.Stat() untuk menyemak sama ada fail wujud:

package main

import (
    "fmt"
    "syscall"
)

func main() {
    var s syscall.Stat_t
    if err := syscall.Stat("/path/to/file", &s); err != nil {
        if err == syscall.ENOENT {
            fmt.Printf("File does not exist: %s\n", err)
        } else {
            fmt.Printf("Error: %s\n", err)
        }
        return
    }
    fmt.Printf("File information: %+v\n", s)
}

Menggunakan syscall, kami boleh memindahkan data antara proses yang berbeza melalui memori kongsi, penghantaran mesej, dsb.

Memori Dikongsi

Memori dikongsi ialah satu bentuk IPC yang membenarkan berbilang proses berkongsi kawasan memori yang sama. Jika perubahan dibuat pada memori kongsi dalam satu proses, perubahan akan berkuat kuasa dalam semua proses menggunakan memori kongsi. Memori yang dikongsi boleh digunakan untuk pemindahan data berkelajuan tinggi, caching data dan struktur data yang dikongsi.

Golang menyediakan pakej sys/mman, yang menyediakan fungsi mmap() yang boleh digunakan untuk berkongsi data antara berbilang proses. Berikut ialah contoh program:

package main

import (
    "fmt"
    "os"
    "strconv"
    "syscall"
)

func main() {
    //创建一个匿名内存映射
    fd, _ := syscall.MemfdCreate("shared_mem_file", syscall.MFD_CLOEXEC)
    defer syscall.Close(fd)
    
    //分配共享内存
    err := syscall.Ftruncate(fd, 1024*1024) // 1 MB
    if err != nil {
        fmt.Printf("Error: %s\n", err)
        return
    }

    // 使用mmap映射内存,通过sllice类型访问共享内存
    mmap, err := syscall.Mmap(fd, 0, 1024*1024, syscall.PROT_READ|syscall.PROT_WRITE, syscall.MAP_SHARED)
    if err != nil {
        fmt.Printf("Error: %s\n", err)
        return
    }
    defer syscall.Munmap(mmap)

    pid := os.Getpid()
    strconv.Itoa(pid)
    
    // 在共享内存中写入当前进程号
    copy(mmap, []byte("Process ID: "+strconv.Itoa(pid)))
    fmt.Printf("Data written to shared memory: %+v\n", mmap[:16])

    // 等待共享内存被读取
    fmt.Printf("Press enter to continue!\n")
    fmt.Scanln()
}

Pengiriman mesej

Pemesejan ialah satu lagi bentuk IPC yang membenarkan proses menghantar mesej dengan menggunakan saluran seperti baris gilir atau paip. Dalam sistem seperti Unix, Golang boleh menggunakan fungsi pasangan soket dalam pakej sys/unix untuk mencipta paip komunikasi dua hala supaya setiap proses boleh menghantar dan menerima mesej melalui saluran ini.

Berikut ialah contoh program yang menggunakan komunikasi paip:

package main

import (
    "fmt"
    "syscall"
    "unsafe"
)

func main() {
    // 创建管道
    var fds [2]int
    if err := syscall.Pipe(fds[:]); err != nil {
        fmt.Printf("Error creating pipe: %s\n", err)
        return
    }
    defer syscall.Close(fds[0])
    defer syscall.Close(fds[1])

    // 重定向stdin
    dupSTDIN, _ := syscall.Dup(0)
    defer syscall.Close(dupSTDIN)
    syscall.Dup2(fds[0], 0)

    // 写入到管道
    fmt.Printf("Writing to pipe...\n")
    fmt.Printf("Data written to pipe: %s\n", "Hello, pipe!")

    // 关闭写管道,避免阻塞
    syscall.Close(fds[1])
    syscall.Dup2(dupSTDIN, 0)

    // 从管道中读取数据
    data := make([]byte, 1000)
    bytesRead, _ := syscall.Read(fds[0], data)
    fmt.Printf("Data read from pipe: %s\n", string(data[:bytesRead]))
}

Isyarat antara proses

Isyarat antara proses ialah kaedah IPC yang membenarkan proses menghantar isyarat kepada proses proses lain. Dalam sistem seperti Unix, isyarat sering digunakan untuk menghantar amaran kepada proses atau memintanya untuk ditutup, dsb.

Di Golang, kita boleh menggunakan fungsi Kill dalam pakej syscall untuk menghantar isyarat antara proses. Berikut ialah contoh program:

package main

import (
    "fmt"
    "os"
    "syscall"
)

func main() {
    pid := os.Getpid()
    fmt.Printf("Current process ID: %d\n", pid)

    // 发送SIGUSR1信号
    err := syscall.Kill(pid, syscall.SIGUSR1)
    if err != nil {
        fmt.Printf("Error sending signal: %s", err)
    }
}

Di sini kami menggunakan isyarat SIGUSR1 dan menghantar isyarat SIGUSR1 kepada proses semasa.

Ringkasan

Dalam artikel ini, kami memperkenalkan kaedah komunikasi IPC Golang, termasuk memori kongsi, penghantaran mesej dan isyarat antara proses. Golang mempunyai sokongan terbina dalam untuk IPC dan menyediakan antara muka untuk mengakses fungsi IPC sistem pengendalian asas melalui panggilan sistem syscall. Kami memperkenalkan cara menggunakan kaedah IPC ini untuk berkomunikasi antara proses melalui program contoh. Dalam aplikasi praktikal, kita harus memilih kaedah IPC yang paling sesuai berdasarkan senario aplikasi tertentu.

Atas ialah kandungan terperinci Bagaimana untuk menyediakan ipc di golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Pergi dengan contoh contoh pembalakan middleware http Pergi dengan contoh contoh pembalakan middleware http Aug 03, 2025 am 11:35 AM

HTTP Log Middleware di GO boleh merakam kaedah permintaan, laluan, IP klien dan memakan masa. 1. Gunakan http.handlerfunc untuk membungkus pemproses, 2. Rekod waktu mula dan masa akhir sebelum dan selepas memanggil next.servehttp, 3. Dapatkan IP pelanggan sebenar melalui r.remoteaddr dan X-forward-for headers, 4. Gunakan log.printf untuk mengeluarkan log permintaan, 5. Kod sampel lengkap telah disahkan untuk dijalankan dan sesuai untuk memulakan projek kecil dan sederhana. Cadangan lanjutan termasuk menangkap kod status, menyokong log JSON dan meminta penjejakan ID.

pergi dengan contoh menjalankan subprocess pergi dengan contoh menjalankan subprocess Aug 06, 2025 am 09:05 AM

Jalankan proses kanak -kanak menggunakan pakej OS/EXEC, buat arahan melalui exec.command tetapi tidak melaksanakannya dengan segera; 2. Jalankan arahan dengan .Output () dan tangkap stdout. Jika kod keluar bukan sifar, kembalikan exec.exiterror; 3. Gunakan .start () untuk memulakan proses tanpa menyekat, menggabungkan dengan .stDoutPipe () untuk menstrimkan output dalam masa nyata; 4. Masukkan data ke dalam proses melalui .StDinPipe (), dan selepas menulis, anda perlu menutup saluran paip dan panggilan .Wait () untuk menunggu akhir; 5. EXEC.EXITError mesti diproses untuk mendapatkan kod keluar dan stderr perintah gagal untuk mengelakkan proses zombie.

Bagaimana anda bekerja dengan pembolehubah persekitaran di Golang? Bagaimana anda bekerja dengan pembolehubah persekitaran di Golang? Aug 19, 2025 pm 02:06 PM

GoProvidesBuilt-InsupportForHandlingenvironmentVariablesViateTheospackage, EnablingDevelelperstoread, Set, danManageenvironmentDataSecurelyAndeFicienty.ToreAdAvariable, UseOS.Getenv ("Kunci")

Apakah alternatif untuk pembalakan perpustakaan standard di Golang? Apakah alternatif untuk pembalakan perpustakaan standard di Golang? Aug 05, 2025 pm 08:36 PM

FORNEWGO1.21 PROJEK, MENGGUNAKAN

Apa yang dilakukan oleh Perintah Perjalanan? Apa yang dilakukan oleh Perintah Perjalanan? Aug 03, 2025 am 03:49 AM

Gorun adalah arahan untuk menyusun dan melaksanakan program GO dengan cepat. 1. Ia melengkapkan kompilasi dan berjalan dalam satu langkah, menghasilkan fail yang boleh dilaksanakan sementara dan memadamnya selepas program selesai; 2. Ia sesuai untuk program bebas yang mengandungi fungsi utama, yang mudah dibangunkan dan diuji; 3. Ia menyokong operasi pelbagai fail, dan boleh dilaksanakan melalui Gorun*.go atau menyenaraikan semua fail; 4. Ia secara automatik memproses kebergantungan dan menggunakan sistem modul untuk menghuraikan pakej luaran; 5. Ia tidak sesuai untuk perpustakaan atau pakej, dan tidak menjana fail binari yang berterusan. Oleh itu, ia sesuai untuk ujian pesat semasa skrip, pembelajaran dan pengubahsuaian yang kerap. Ia adalah cara yang cekap dan ringkas.

Memilih Rangka Kerja Web Go: Gin vs Echo vs Fiber Memilih Rangka Kerja Web Go: Gin vs Echo vs Fiber Aug 03, 2025 am 03:57 AM

Forhigh-performancemicroserviceswithlowlatencyandhighload, optionfiber; 2.forstandardrestapis, internalTools, ormvps, optionginorecho; 3.formaximummiddlewarecompatibility, optionginorecho;

Apakah amalan terbaik untuk versi API dalam perkhidmatan Golang? Apakah amalan terbaik untuk versi API dalam perkhidmatan Golang? Aug 04, 2025 pm 04:50 PM

UseurlpathversioningLike/api/v1forclear, boleh diperbaiki, dan pemaju-friendlyversioning.2.applysemanticversioningwithmajorversions (v1, v2)

Bagaimana untuk menyambung ke pangkalan data SQL di GO? Bagaimana untuk menyambung ke pangkalan data SQL di GO? Aug 03, 2025 am 09:31 AM

Untuk menyambung ke pangkalan data SQL di GO, anda perlu menggunakan pakej pangkalan data/SQL dan pemacu pangkalan data tertentu. 1. Pakej dan Pemacu Pangkalan Data/SQL Import (seperti github.com/go-sql-driver/mysql), perhatikan bahawa menggariskan sebelum pemandu menunjukkan bahawa ia hanya digunakan untuk permulaan; 2. Gunakan sql.open ("mysql", "pengguna: kata laluan@tcp (localhost: 3306)/dbName") untuk membuat pemegang pangkalan data, dan hubungi db.ping () untuk mengesahkan sambungan; 3. Gunakan db.query () untuk melaksanakan pertanyaan, dan db.exec () untuk melaksanakan

See all articles