多进程
使用进程实现多任务
multiprocessing模块就是跨平台的多进程模块提供了有个Process类来代表一个进程对象,这个对象可以理解为一个独立的进程,可以执行另外的事情
进程和线程之间的对比
进程:能够完成多任务,一台电脑可以开多个浏览器
线程:能够完成多任务,一个微信可以同时和多人聊天
根本区别
进程是操作系统资源分配的基本单位,而线程,则是任务调度和执行的基本单位
内存分配
-
系统为每个进程分配不同的内存空间;
-
而对线程而言,除了CPU外,系统不会为线程分配内存(线程所使用的资源来自其所属进程的资源),线程组之间只能共享资源
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)
标签:__,23,list,进程,import,data,multiprocessing
From: https://www.cnblogs.com/blog4lyh/p/16945828.html