23.多进程

多进程

使用进程实现多任务

multiprocessing模块就是跨平台的多进程模块提供了有个Process类来代表一个进程对象,这个对象可以理解为一个独立的进程,可以执行另外的事情

进程和线程之间的对比

进程:能够完成多任务,一台电脑可以开多个浏览器

线程:能够完成多任务,一个微信可以同时和多人聊天

根本区别

进程是操作系统资源分配的基本单位,而线程,则是任务调度和执行的基本单位

内存分配

  • 系统为每个进程分配不同的内存空间;

  • 而对线程而言,除了CPU外,系统不会为线程分配内存(线程所使用的资源来自其所属进程的资源),线程组之间只能共享资源

image

import threading
import time
import multiprocessing

def demo1():
    while True:
        print("我是demo1")
        time.sleep(1)
def demo2():
    while True:
        print("我是demo2")
        time.sleep(1)

if __name__ == '__main__':
    t1 = threading.Thread(target=demo1)
    t2 = threading.Thread(target=demo2)
    t1.start()
    t2.start()
    # p1 = multiprocessing.Process(target=demo1)
    # p2 = multiprocessing.Process(target=demo2)

    # p1.start()
    # p2.start()

进程之间的通信 --Queue

Queue---先进先出队列

import multiprocessing


def down_load(queue):
    list = [1,2,3,4,5,6,7,8,9,0]
    for li in list:
        queue.put(li)
    print("数据获取完成")


def parse_data(queue):
    list_data = []
    while True:
        data = queue.get()
        list_data.append(data)

        if queue.empty():
            break
    print(list_data)

def main():
    queue = multiprocessing.Queue()
    q1 = multiprocessing.Process(target=down_load,args=(queue,))
    q2 = multiprocessing.Process(target=parse_data,args=(queue,))
    q1.start()
    q2.start()


if __name__ == '__main__':
    main()

进程池

当需要创建的子进程数量不多时,,可以直接利用multiprocessing中的Process,动态生成多个进程,但是如果有上千进程,手动创建工作量巨大,这个时候我们可以创建一个进程池

进程池实战

from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor
import requests
import json
import csv

f = open("movie.csv", mode="w", encoding="utf-8", newline="")
write = csv.writer(f)


class DouBan(object):
    def __init__(self):
        self.headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.67 Safari/537.36"}

    def get_data_index(self, url):
        resp = requests.get(url, headers=self.headers)
        data_list = json.loads(resp.text)
        for data in data_list:
            title = data["title"]
            actors = ",".join(data["actors"])
            types = ",".join(data["types"])
            movie_list = [title, actors, types]
            print(movie_list)
            write.writerow(movie_list)


if __name__ == '__main__':
    spider = DouBan()
    with ThreadPoolExecutor(20) as td:
        for num in range(50):
            url = "https://movie.douban.com/j/chart/top_list?type=11&interval_id=100%3A90&action=&start={}&limit=20".format(
                num * 20)
            td.submit(spider.get_data_index, url)
posted @   做笔记的一天  阅读(28)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示