day3.22

day3.22-多线程和多进程

01. 什么是多线程和多进程

# 1. 什么是进程
'''
一个正在运行的应用程序。
每一个进程在其专用且受保护的内存(运行内存)中
'''
# 2. 什么时候线程
'''
线程是进程执行任务的基本单位
进程要做什么事,或者要干什么活必须要有线程
'''
# 3. 线程的特点    -   串行
'''
如果要在一个线程中执行多个任务,任务是串行执行的(一个一个按顺序执行)
'''
# 4. 多线程
'''
默认情况下一个进程只有一个线程(一个工厂只有一个工人),多线程指的是在一个进程中有多个线程(一个工厂有多个工人)
多线程执行任务可以并行(同时)执行
注意:多线程可以提高程序执行效率,但不是越多越好。(计算机一般的应用程序不要超过100个,爬虫可以到达200-300个)
'''

02. 多线程

from threading import Thread,current_thread
import time
from datetime import datetime

# 1. 主线程
# 一个进程默认只有一个线程,这个线程叫主线程,除了主线程之外的线程都叫子线程
# 如果进程中需要子线程,只能自己创建(创建线程类或者线程类的子类对象)

# print(current_thread())

def download(name):
    print(f'{name}开始下载{datetime.now()}')
    time.sleep(2)
    print(f'{name}下载完成{datetime.now()}')



# 2. 单线程的串行
# download('上海堡垒')
# download('午夜凶铃')
# download('沉默的羔羊')

# 3. 创建三个子线程,下载三部电影
'''
1)创建线程对象,并且分配线程任务:Thread(*,target,args)
target  -   需要在子线程中调用的函数,需要一个普通函数的函数名(代表任务)
args    -   在子线程中调用target对应的函数的时候,需要的参数的元组
            需要一个实参,元组就给一个元素,如果需要两个实参,元组就给两个元素
'''
t1 = Thread(target=download,args=('午夜凶铃',))
t2 = Thread(target=download,args=('沉默的羔羊',))
t3 = Thread(target=download,args=('上海堡垒',))

# 2)启动线程:线程对象.start()
t1.start()
t2.start()
t3.start()

03. 线程阻塞

import time
from datetime import datetime
from random import randint
from threading import Thread

def download(name):
    print(f'{name}开始下载{datetime.now()}')
    time.sleep(randint(2,8))
    print(f'{name}下载完成{datetime.now()}')

t1 = Thread(target=download,args=('看不见的客人',))
t2 = Thread(target=download,args=('触不可及',))
t3 = Thread(target=download,args=('肖申克的救赎',))
t4 = Thread(target=download,args=('霸王别姬',))

# 需求1:等到四个电影全部下载完成(四个子线程都结束)才打印’电影全部下载完成‘
# 1. 阻塞线程   -   等到某个线程的任务结束才接着执行
# 线程对象.join()
# t1.start()
# t2.start()
# t3.start()
# t4.start()

# t1.join()
# t2.join()
# t3.join()
# t4.join()
# print('=============== 全部下载完成 ==============')

# 需求2:第一个电影下载挖不出后才将开始2,3,4个电影
# t1.start()
# t1.join()
#
# t2.start()
# t3.start()
# t4.start()

# 要求所有电影都下载结束打印’全部下载完成‘
names = ['肖申克的救赎', '触不可及', '看不见的客人', '霸王别姬']
# a = len(names)
# i = 1
# for name in names:
#     t = Thread(target=download, args=(name,))
#     t.start()
#     if i == a:
#         t.join()
#         print('全部下载完成')
#     i += 1

ts = []
for name in names:
    t = Thread(target=download, args=(name,))
    t.start()
    ts.append(t)
for t in ts:
    t.join()
print('全部下载完成')

04. 多进程

from multiprocessing import Process
import time
from datetime import datetime

# 1. 多进程
'''
一个应用程序默认只有一个进程(主进程),每一个进程中默认有有一个线程(主线程);
一个程序可以有多个进程(除了主进程意外的进程叫子进程),任何一个进程有可以有多个线程

如果希望程序中有子进程,需要自己创建进程对象(创建的进程都自带一个线程)
'''

# 2. 使用多进程
def download(name):
    print(f'{name}开始下载{datetime.now()}')
    time.sleep(2)
    print(f'{name}下载完成{datetime.now()}')

# 注意:如果要使用多进程,必须要在程序中加if语句
if __name__ == '__main__':
    # 1)创建进程对象
    p1 = Process(target=download,args=('肖申克的救赎',))
    p2 = Process(target=download,args=('阿甘正传',))
    p3 = Process(target=download,args=('绿里奇迹',))
    p4 = Process(target=download,args=('无间道',))

    # 2)启动进程
    p1.start()
    p2.start()
    p3.start()
    p4.start()

    # 3)进程阻塞
    p1.join()
    p2.join()
    p3.join()
    p4.join()
    print('======')

作业

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver import Chrome,ChromeOptions
from multiprocessing import Process
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup
import lxml
import csv

options = ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-automation'])
options.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2})

def get_info(name):
    url = 'https://www.jd.com/'
    b = Chrome(options=options)
    b.get(url)
    search = b.find_element_by_id('key')
    search.send_keys(name)
    search.send_keys(Keys.ENTER)
    wait = WebDriverWait(b,10)
    wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#J_goodsList > ul > li')))
    height = 500
    for _ in range(10):
        b.execute_script(f'window.scrollTo(0, {height})')
        height += 1000
        time.sleep(1)

    response = b.page_source
    soup = BeautifulSoup(response,'lxml')

    all_li = soup.select('#J_goodsList > ul > li')[1:]
    page_data = []
    for li in all_li:
        all_data = []
        price = li.select_one('.p-price i').text
        name_good = li.select_one('.p-name em').text
        num = li.select_one('.p-commit strong').text
        shop = li.select_one('.p-shop a').text
        all_data.append(name_good)
        all_data.append(price)
        all_data.append(shop)
        all_data.append(num)
        page_data.append(all_data)
    save_data(page_data,name)


def save_data(page_data,name):
    write1 = csv.writer(open(f'{name}.csv','w',encoding='utf-8',newline=''))
    write1.writerow(['name','price','shop','num'])
    write1.writerows(page_data)



if __name__ == '__main__':
    names = ['板鞋','笔记本','睡衣']
    # names =['板鞋']
    for name in names:
        p = Process(target=get_info,args=(name,))
        p.start()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值