golang channel 多協程問題示例

2021-10-07 18:46:07 字數 707 閱讀 5846

package main

import (

"fmt"

"time"

)// 使用channel一樣要遵守一些約定。

// 乙個約定就是將記憶體的所有權交出去後,無論是通過記憶體指標,還是訊息控制,就不能再操作這塊記憶體。否則一樣會引入多執行緒問題

func main() )

go func()

output <- arr

time.sleep(time.second * 2)

arr[1] = 5 // 2秒後賦值為 5

stop <- struct{}{}

}()outarr := <-output // 立即執行輸出,如果沒有延遲,應是輸出原始值

fmt.printf("%v\n", outarr)

outarr[1] = 10 // 立即輸出賦值為10的操作

fmt.printf("%v\n", outarr)

//對於主線程而言,將outarr[1]設定為10後,兩次讀的結果不同,資料被破壞。

time.sleep(time.second * 2) // 2秒後再執行這個輸出。

fmt.printf("%v\n", outarr)

<-stop

}

輸出:

[1 2 3]

[1 10 3]

[1 10 3]

多協程爬蟲

要實現非同步的爬蟲方式的話,需要用到多協程。同步的爬蟲方式爬取這8個 import requests,time 匯入requests和time start time.time 記錄程式開始時間 url list 把8個 封裝成列表 for url in url list 遍歷url list r r...

golang channel基本操作

channel可以實現執行緒的阻塞。建立無緩衝區channel,只能存放乙個值。var ch make chan int 建立有緩衝區channel,可以存放多個值,值到達上限才會阻塞。var ch1 make chan int,3 賦值 ch 555 取值 ch 關閉chnneal,關閉後無法在使...

gevent多協程運用

導包import gevent 猴子補丁 from gevent import monkey monkey.patch all from d8 db import connectmysql import time import pymysql 協程入庫 class myinsertgevent ob...