19. Goroutines(并发)

请注意,在运行这些命令时,编号在两次运行之间的顺序不同。在Python示例中,当所有请求完成后,它将自动退出。

19.1. Python

#!/usr/bin/env python
# -*- coding:utf8 -*-
# auther; 18793
# Date:2020/4/21 13:50
# filename: sample1.py
import urllib.request
import urllib.error
import multiprocessing


def f(url):
    try:
        req = urllib.request.urlopen(url)
        print(len(req.read()))
    finally:
        req.close()


urls = (
    "http://www.peterbe.com",
    "http://peterbe.com",
    "http://htmltree.peterbe.com",
    "http://tflcameras.peterbe.com",
)

if __name__ == '__main__':
    p = multiprocessing.Pool(3)
    p.map(f, urls)

19.2. Go

package main

import (
    "fmt"
    "io/ioutil"
    "net/http"
)

func f(url string) {
    response, err := http.Get(url)
    if err != nil {
        panic(err)
    }
    defer response.Body.Close()
    body, err1 := ioutil.ReadAll(response.Body)
    if err1 != nil {
        panic(err1)
    }

    fmt.Println(len(body))
}

func main() {
    urls := []string{
        "http://www.peterbe.com",
        "http://peterbe.com",
        "http://htmltree.peterbe.com",
        "http://tflcameras.peterbe.com",
    }
    for _, url := range urls {
        // 开启Goroutines
        go f(url)
    }
    // necessary so it doesn't close before
    // the goroutines have finished
    var input string
    fmt.Scanln(&input)
}