day28学习与总结

from threading import Thread, current_thread# 导入线程队列
from queue import Queue
import time
from random import randint# 1. 线程间通信
# 同一个进程中的多个线程可以直接通信(一个线程可以直接使用另外一个线程中产生的数据)
# 通信原则:使用全局变量# ======================案例1=============================
# def sum1(x, y):
#     # z是第一个子线程定义的全局变量
#     global z
#     z = x + y
#     print(current_thread(), a)
## def func2():
#     print(current_thread(), z, a)
## if __name__ == '__main__':
#     # a是在主线程中定义的全局变量
#     a = 100
#
#     t1 = Thread(target=sum1, args=(10, 20))
#     t1.start()
#
#     t1.join()
#
#     t2 = Thread(target=func2)
#     t2.start()
#
#     print('主线程:', current_thread(), z)# ======================案例2  -  收集其他线程产生的数据 ============================
# def download(name):
#     # print(f'{name}数据')
#     time.sleep(randint(2, 7))
#     all_data.append(f'{name}数据')
#
#
# if __name__ == '__main__':
#     # 定义全局列表
#     all_data = []
#
#     # 创建子线程同时下载多个电影数据
#     names = ['电影1', '电影2', '电影3', '电影4']
#     ts = []
#     for name in names:
#         t = Thread(target=download, args=(name,))
#         t.start()
#         ts.append(t)
#
#     # 等到所有电影都下载结束后,在主线程中处理下载得到的数据
#     for t in ts:
#         t.join()
#
#     print(all_data)# ======================案例3 - 使用线程队列 ==========================
def download(name):# print(f'{name}数据')time.sleep(randint(3, 7))# 1)添加数据q.put(f'{name}数据')if __name__ == '__main__':# 使用队列# 1)创建队列对象q = Queue()# 创建子线程同时下载多个电影数据names = ['电影1', '电影2', '电影3', '电影4']for name in names:t = Thread(target=download, args=(name,))t.start()# 3). 获取队列中的数据# 队列的get操作有等待的功能:如果在执行get的时候队列为空,代码不会报错,而是停留在当前位置,直到队列不为空或者超时为止for _ in range(4):print(q.get(timeout=8))
from multiprocessing import Process, Queue, current_process   # 这个队列是进程队列,支持多进程通信
from threading import Thread
# from queue import Queue    # 这个是线程队列,不能进行进程间通信# 1. 进程间通信
# 不同进程中的数据无法直接共享,如果进程间想要通信(数据传递)必须使用进程队列
def func1(queue):# print('进程1', x)     # # 报错!# global y# y = 200# all_data.append(100)print('func1:', current_process())queue.put(100)def func2(queue):# print('进程2', x)       # 报错!# global z# z = 300# all_data.append(200)print('func2:', current_process())queue.put(200)def func3():print('func3:', current_process())q.put(300)# 2. 进程队列的使用方法
if __name__ == '__main__':x = 100all_data = []# 1)创建全局进程队列对象q = Queue()print('创建队列:', current_process())# 2) 将队列对象作为参数传递到进程中# 如果使用队列的进程和创建队列的进程不一致就必须通过参数传递对列,但是如果是同一个进程直接使用p1 = Process(target=func1, args=(q,))p2 = Process(target=func2, args=(q,))p1.start()p2.start()# 线程对象在哪个进程中创建,线程就属于哪个进程t1 = Thread(target=func3)t1.start()# p1.join()# p2.join()# print(all_data)# 3)在任意进程中使用队列获取数据print(q.get(timeout=2))print(q.get(timeout=2))print(q.get(timeout=2))
4 import BeautifulSoup
import csv
from threading import Threadoptions = ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-automation'])
options.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2})def get_html(name, queue: Queue):"""获取指定商品的前10页数据name - 商品名称"""b = Chrome(options=options)b.implicitly_wait(5)b.get('https://www.jd.com')search = b.find_element_by_id('key')search.send_keys(name)search.send_keys(Keys.ENTER)for _ in range(3):wait = WebDriverWait(b, 5)wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'gl-warp')))for _ in range(6):b.execute_script('window.scrollBy(0, 800)')time.sleep(1)queue.put(name + '+===+' + b.page_source)btn = b.find_element_by_class_name('pn-next')btn.click()def save_data():# 主进程中取从子进程中得到的数据while True:result = q.get()  # type: strif result == 'end':break# 解析数据并且保存数据# 1)获取商品名和网页源代码name, html = result.split('+===+')# 2)解析数据soup = BeautifulSoup(html, 'lxml')all_li = soup.select('.gl-warp>li')goods = []for li in all_li:title = li.select_one('.p-name>a').attrs['title']price = li.select_one('.p-price i').textcomment = li.select_one('.p-commit a').textshop = li.select_one('.p-shop a').textgoods.append([title, price, comment, shop])# 3)写入文件# print(name, goods)if name == '运动鞋':writer1.writerows(goods)else:writer2.writerows(goods)print('一页数据写入成功!')if __name__ == '__main__':# 创建队列获取两个子进程中获取到的网页数据q = Queue()writer1 = csv.writer(open('files/运动鞋.csv', 'w', encoding='utf-8', newline=''))writer1.writerow(['商品', '价格', '评论数', '店铺'])writer2 = csv.writer(open('files/笔记本电脑.csv', 'w', encoding='utf-8', newline=''))writer2.writerow(['商品', '价格', '评论数', '店铺'])# 创建主进程的子线程解析数据t = Thread(target=save_data)t.start()# 在两个子进程中操作网页获取网页数据p1 = Process(target=get_html, args=('运动鞋', q))p2 = Process(target=get_html, args=('笔记本电脑', q))p1.start()p2.start()p1.join()p2.join()q.put('end')
from queue import Queue
import time
from random import randint
from threading import Threaddef dowload(name):time.sleep(randint(1, 10))# 子线程获取到一个数据就往队列中添加一个数据q.put(f'{name}数据')def get_data():while True:data = q.get()if data == 'end':breakprint(data)if __name__ == '__main__':# 1. 创建队列,并且创建一个子线程获取队列中的数据q = Queue()t2 = Thread(target=get_data)t2.start()# 2. 创建多个线程同时获取多个数据ts = []# range(N)  - 0 ~ N-1for x in range(randint(30, 50)):t = Thread(target=dowload, args=(f'电影{x}',))t.start()ts.append(t)# 3. 等到所有的任务都完成,把队列结束标志添加到队列中for t in ts:t.join()q.put('end')import time
from random import randint
from threading import Thread, current_thread# 导入线程池(线程池执行者)对应的类
from concurrent.futures import ThreadPoolExecutor# 1. 线程池
"""
一个线程池中可以有多个线程,并且可以添加多个任务(任务的数量可以比线程的数量多),
线程池会自动给线程池的线程分配任务,直到所有的任务都完成。
"""def download(name):time.sleep(randint(2, 6))print(f'{name}数据', current_thread())def func1(x, y):print(x, y)if __name__ == '__main__':names = [f'电影{x}' for x in range(50)]# 方法1:直接使用多线程下载50个电影# for x in names:#     t = Thread(target=download, args=(x, ))#     t.start()# 方法2:使用线程池# 1. 创建线程池: ThreadPoolExecutor(线程数)pool = ThreadPoolExecutor(50)# 2. 添加任务# 1)任务一个一个的添加到线程池中: 线程池对应.submit(任务对应的函数, 实参1, 实参2, 实参3,...)# 任务对应的函数只有一个参数# pool.submit(download, '肖生克的救赎')# pool.submit(func1, 100, 200)# for x in names:#     pool.submit(download, x)# 2)同时添加多个任务  -  任务对应的函数有且只有一个参数# 线程池对象.map(函数, 实参对应的序列)pool.map(download, names)# 线程池关闭前可以随时添加任务pool.submit(download, '肖生克的救赎')pool.submit(func1, 100, 200)# 3. 关闭线程池并且等待线程池的任务结束# 关闭线程池指的停止往线程池中添加任务pool.shutdown()# 不能线程池关闭以后添加任务# pool.submit(func1, 400, 300)      # 报错!print('==============================')
# 导入进程池类
from multiprocessing import Pool, current_process
import time
from random import randintdef download(name):time.sleep(randint(2, 6))print(f'{name}数据', current_process())def func1(x, y):print(x, y)if __name__ == '__main__':# 1. 创建进程池对象pool = Pool(5)# 2. 添加任务# 1) 一次添加一个任务# pool.apply_async(download, args=('肖申克的救赎',))# pool.apply_async(func1, args=(100, 200))# for x in range(10):#     pool.apply_async(download, args=(f'电影{x}',))# 2) 同时添加多个任务pool.map_async(download, ['电影1', '电影2', '电影3'])# 3. 关闭进程池(通过async方式添加的任务,必须在任务添加结束后依次执行close和join操作,任务才会启动)pool.close()pool.join()

作业:

from multiprocessing import Pool
from selenium.webdriver import Chrome,ChromeOptions
from selenium.webdriver.common.keys import Keys
from lxml import etree
import time,csv
options = ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-automation'])
options.add_experimental_option('prefs', {'profile.managed_default_content_settings.images':2})
def get_data(name):b = Chrome(options=options)b.get('https://www.51job.com/')search = b.find_element_by_id('kwdselectid')search.send_keys(name)search.send_keys(Keys.ENTER)time.sleep(5)html = etree.HTML(b.page_source)money = html.xpath('//a/p[2]/span[1]/text()')place = html.xpath('//a/p[2]/span[2]/text()')position = html.xpath('//a/p[1]/span[1]/text()')goods = []for h, n in enumerate(money):goods.append([money[h], place[0], position[0]])if name =='java':writer1 = csv.writer(open('files/java.csv', 'w', encoding='utf-8', newline=''))writer1.writerows(goods)else:writer2 = csv.writer(open('files/数据分析师.csv', 'w', encoding='utf-8', newline=''))writer2.writerows(goods)print('一页数据写入成功!')
if __name__=="__main__":writer1 = csv.writer(open('files/java.csv', 'w', encoding='utf-8', newline=''))writer1.writerow(['工资', '地点', '要求'])writer2 = csv.writer(open('files/数据分析师.csv', 'w', encoding='utf-8', newline=''))writer2.writerow(['工资', '地点', '要求'])pool = Pool(2)pool.map_async(get_data, ['数据分析师', 'java'])pool.close()pool.join()

day28学习与总结相关推荐

  1. 深度学习 Day28——利用Pytorch实现好莱坞明星识别

    深度学习 Day28--利用Pytorch实现好莱坞明星识别 文章目录 深度学习 Day28--利用Pytorch实现好莱坞明星识别 一.前言 二.我的环境 三.前期工作 1.导入依赖项设置GPU 2 ...

  2. pythonsocket自定义协议_小渣渣学习笔记 python day28【tcp聊天 udp聊天 粘包 自定义协议 struct模块】...

    tcp 实现聊天功能 server端 import socket sk = socket.socket() sk.bind(('127.0.0.1',22000)) sk.listen() while ...

  3. Python学习 Day28 JS函数(二)

    JS函数(二) (一)return关键字 关键字return一般结合函数一起使用.而且需要注意,这个关键字一般只能在函数体中使用 作用: 1.函数体中如果遇见关键字return,函数体后面语句不再执行 ...

  4. 学习日记day28 平面设计 构图

    一.排版基本认识 平面设计是一种展示的艺术,你要展示什么内容,怎么来展示它,这也就是平面设计的排版了.好的排版能将平面设计的设计效果发挥到最好,吸引更多的目光,那么,如何才能做好排版工作呢? 1.保证 ...

  5. java基础学习 day28(就近原则,this关键字,构造方法,标准Javabean类)

    1. 成员变量和局部变量: 成员变量:变量定义在方法外,类里 局部变量:变量定义在方法里 2. 就近原则: 当成员变量名与局部变量名一致时,若使用这个名字,使用的是离这个调用位置最近的变量(如果局部变 ...

  6. 前端学习day28:响应式布局、阿里图标等

    1. 阿里图标 使用场景及原理 原理:将小图标定义成字体,通过引入字体来展示这些小图标.因为此时的小图标相当于是一个文字,所以支持文字对应的所有样式. 使用步骤 1.打开阿里图标官网(https:// ...

  7. 网络安全之路:我的系统性渗透测试学习框架

    没有兴趣,何来成就,难道就只是为了咕噜猫?hahaha(听不懂吧,没关系,只是因为加密了,你能从我的笔记中找到答案么嘿嘿嘿嘿!!!) 注意:以下内容仅记录本人当时学习时任然不知的相关知识.笔记草率,可 ...

  8. Java学习总结第一阶段

    day1(甘特图)预科阶段 甘特图:让工程项目变成可视化图表,也叫项目进度规划表. 一般由:任务名称.工期.开始时间.完成时间.前置任务.资源名称.日期组成 如下所示,资源名称那就是人的名字,前置任务 ...

  9. 学习日记day32 平面设计 字体构图风格3(创意、构图)

    接学习日记day28 平面设计 构图&风格 一.基本认识 字体  风格   版式   色彩  创意 黄金圆绘制:先随便绘制一个圆,然后利用变换面板,让上一个圆的半径除以1.618,重复数次,就 ...

最新文章

  1. 人类基因组注释包org.Hs.eg.db
  2. php仿tp5实现模型,php手记之05-tp5模型操作数据库
  3. RPM方式安装MySQL5.6
  4. Eclipse中的Github Gists
  5. [工具库]JFileDownloader工具类——多线程下载网络文件,并保存在本地
  6. 【转载保存】java优先队列使用
  7. SQL Server之备份和还原系统数据库
  8. python numpy安装失败_解决python3.x安装numpy成功但import出错的问题
  9. python基础学习笔记4--抽象
  10. MVC---------ViewBag
  11. 多级联动(已知和未知级次)
  12. 如何用Java将DWG和DXF文件转换为PDF?看了这篇就懂了
  13. UCOS-III系统概述
  14. 华裔计算机科学家晟,微软亚洲研究院发表了超过5000篇科研论文:晟最受赞许的企业研究院...
  15. Boost编译一步步来
  16. 小白白之青龙面板搭建
  17. 3.1 YOLO系列理论(YOLOV1、YOLOV2、YOLOV3)
  18. [facebook-wda]搭建iOS App自动化环境
  19. idea本地项目上传至远程仓库及一些常见问题的解决办法
  20. 位域外部申明_(外部)域特定语言的完整指南

热门文章

  1. HTML学习笔记(一)(HTML基础)
  2. Photoshop 2023 Beta 24.6_爱国版_安装教程,内置AI绘画_创意填充Generative Fill功能及常见问题
  3. 简单理解低耦合高内聚
  4. CSS中的BFC BFC详解 BFC可以解决的问题汇总
  5. 虚拟现实技术知识点总结
  6. linux 跳板机 外网,linux 基于ssh创建跳板机
  7. linux跳板机权限管理,linux Jumpserver跳板机 /堡垒机详细部署
  8. 北科天绘 16线3维激光雷达开发教程
  9. 采购协议、合同的审核及下达
  10. 搭建公网服务器及配置深度学习环境