Python并发编程---多进程multiprocess(3)

Python并发编程—多进程multiprocess(3)

进程池Pool

class multiprocessing.pool.Pool([processes[, initializer[, initargs[, maxtasksperchild[, context]]]]])

参数说明

process: 进程数量,默认cpu_count

initializer: 如果设置了initalizer,进程启动时调用initializer(*initargs)

initargs:

maxtasksperchild:工作进程在退出并用新的工作进程替换之前可以完成的任务数,以释放未使用的资源。默认是None, 这意味着工作进程将与池一样长。

context: 指定用于启动工作进程的上下文

方法

apply(func[, args[, kwds]]):阻塞到返回结果

apply_async(func[, args[, kwds[, callback[, error_callback]]]]):如果指定 callback ,当结果变为就绪时,callback 应用于它,调用失败,这种情况下应用 error_callback。

map(func, iterable[, chunksize]):此方法将iterable切成多个块,将其作为单独的任务提交到进程池。这些块的(近似)大小可以通过将 chunksize 设置为正整数来指定。

map_async(func, iterable[, chunksize[, callback[, error_callback]]]):此方法将iterable切成多个块,将其作为单独的任务提交到进程池。如果指定 callback ,当结果变为就绪时,callback 应用于它,调用失败,这种情况下应用 error_callback。

starmap(func, iterable[, chunksize]):
类似于map(),解包方式不同,参数[(1,2), (3, 4)] 会解包成 [func(1,2), func(3,4)]方式运行

starmap_async(func, iterable[, chunksize[, callback[, error_back]]]):

close():关闭后,进程池不再接受新任务。一旦所有任务完成,工作进程将退出。

terminate():立即停止工作进程,而不完成未完成的工作。

join():等待工作进程退出。在使用 join() 之前必须调用 close() 或 terminate()。

获取进程池运行结果

AsyncResult
get([timeout]):返回结果

wait([timeout]):等待结果可用或直到超时。

ready():返回调用是否已完成。

successful(): 返回调用是否完成

"""多进程爬虫"""
from multiprocessing.pool import Pool
from pprint import pprint

import requests
from lxml import etree
import time


def get_title(url):
    # 爬取搜索结果第一天的title
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.84 Safari/537.36",
    }
    res = requests.get(url, headers=headers).content
    doc = etree.HTML(res)

    xpath_ = '//div[@class="result c-container " and @id="1"]/h3/a[1]//text()'
    return ''.join(doc.xpath(xpath_))


if __name__ == "__main__":
    start = time.time()
    # 待爬去的url列表
    url_list = ["https://www.baidu.com/s?wd=python",
                "https://www.baidu.com/s?wd=requests",
                "https://www.baidu.com/s?wd=python requests",
                "https://www.baidu.com/s?wd=python 爬虫",
                "https://www.baidu.com/s?wd=python lxml",
                "https://www.baidu.com/s?wd=python xpath"]
    with Pool(2) as pool:
        result = pool.map_async(get_title, url_list)
        pprint(result.get())
    end = time.time()
    print(end - start)

['Welcome to Python.org',
 'Requests: HTTP for Humans™ — Requests 2.20.1 documentation',
 'python-requests官方中文文档 - 快速上手 — Requests 2.18.1 文档',
 '爬虫- Python - 伯乐在线',
 'lxml · PyPI',
 'python爬虫之xpath的基本使用 - Charles.L - 博客园']
2.8625741004943848

你可能感兴趣的:(Python并发编程---多进程multiprocess(3))