2021.04.08

线程和进程的作用

直接通过Thread创建子线程

Thread(target=需要在子线程中调用的函数,args=(函数的实参列表))

from threading import Thread
import time
from datetime import datetime
from concurrent.futures import ThreadPoolExecutor
from threading import current_thread
def download(url):print(f'=========={current_thread()}=========')print(f'{url}开始下载:{datetime.now()}')time.sleep(1)print(f'{url}下载结束:{datetime.now()}')
1) 在主线程中下载三个电影:需要时间是三个电影的时间的叠加
download('肖生克的救赎')
download('摔跤吧,爸爸')
download('霸王别姬')
2) 多线程下载三个电影
t1 = Thread(target=download, args=('肖生克的救赎',))
t2 = Thread(target=download, args=('摔跤吧,爸爸', ))
t3 = Thread(target=download, args=('霸王别姬',))
t1.start()
t2.start()
t3.start()
  1. 线程池
pool = ThreadPoolExecutor(max_workers=2)# a.一次添加一个任务(任务对应的函数可以是任何类型)
pool.submit(download, '肖生克的救赎')# b.一次添加多个任务
pool.map(download, ['霸王别姬', '阿甘正传', '这个杀手不太冷', 'V字仇杀队', '沉默的羔羊'])# 关闭线程池
pool.shutdown()

创建线程子类

from threading import Thread
from datetime import datetime
import timeclass DownloadThread(Thread):def __init__(self, url):super().__init__()self.url = urldef run(self) -> None:# 确定需要在子线程中完成的任务print(f'{self.url}开始下载:{datetime.now()}')time.sleep(1)print(f'{self.url}下载结束:{datetime.now()}')t1 = DownloadThread('肖生克的救赎')
t2 = DownloadThread('阿甘正传')
t3 = DownloadThread('霸王别姬')
t1.start()
t2.start()
t3.start()

数据分析岗位爬取

import requests
from re import search
import json
from concurrent.futures import ThreadPoolExecutor
from threading import Thread
from datetime import datetime
import csv
# 多线程的Queue
from queue import Queuedef an_data(html: str):result = search(r'(?s)window.__SEARCH_RESULT__\s*=(.+?)</script>', html)result_dict = json.loads(result.group(1))return result_dict['engine_search_result']def get_data(url):# print(f'{url}开始!')headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36',}response = requests.get(url, headers=headers)if response.status_code == 200:return an_data(response.text)else:print(response)all_data = []
q = Queue()def get_all():pool = ThreadPoolExecutor(200)page = 1print(f'start:{datetime.now()}')while page < 2000:fu = pool.submit(get_data, f'https://search.51job.com/list/090200,000000,0000,00,9,99,数据分析,2,{page}.html?lang=c&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&ord_field=0&dibiaoid=0&line=&welfare=')if not fu.result():pool.shutdown()print(f'end:{datetime.now()}')# 方法二-2:写入所有的数据# with open('files/数据分析2.csv', 'w', newline='', encoding='utf-8') as f:#     print('打开文件!')#     writer = csv.DictWriter(f, all_data[0].keys())#     writer.writeheader()#     writer.writerows(all_data)# del all_data# q.put('end')breakpage += 1# 获取结果data = fu.result()# ==================存储数据==============# 方案一: 得到一页数据就打开一次文件, 缺点:消耗额外的CPU资源# data = fu.result()# save1(data)# 方案二-1:得到所有数据,然后将数据一次性写入文件中, 缺点:在一定时间内容内存消耗增加# all_data.extend(data)# 方案三:# q.put(data)pool.shutdown()def save1(data):with open('files/数据分析.csv', 'a', newline='', encoding='utf-8') as f:print('打开文件')writer = csv.DictWriter(f, list(data[0].keys()))writer.writerows(data)print('写入数据!')def save2():with open('files/数据分析3.csv', 'w', encoding='utf-8', newline='') as f:print('=======打开文件')first = q.get()print('========写入文件')writer = csv.DictWriter(f, first[0].keys())writer.writeheader()writer.writerows(first)while True:data = q.get()if data == 'end':breakwriter.writerows(data)print('========写入文件')# t = Thread(target=save2)
# t.start()get_all()
# save2()

线程间和进程间通信

同一个进程中的多个线程数据可以直接共享,不同进程中的数据不能直接共享

from threading import Thread, current_thread
from multiprocessing import Process, current_process

多线程之间的数据通信

a = []def func1():a.append('A')def func2():a.append('B')t1 = Thread(target=func1)
t2 = Thread(target=func2)
t1.start()
t2.start()
t1.join()
t2.join()
print(a)

多进程之间的数据通信

a = []def func1(data1, data2):print('进程1:', current_process())a.append('A')def func2(data1):print('进程2:', current_process())a.append('B')if __name__ == '__main__':print('主进程:', current_process())#  创建进程对象p1 = Process(target=func1, args=(100, 200))p2 = Process(target=func2, args=(111,))p1.start()p2.start()p1.join()p2.join()print('任务全部完成:', a)

进程间有效通信

使用多进程队列中需要注意:1.将队列定义全局变量 2.队列对象必须通过在子进程中调用的函数的参数传递到进程中去

import time
from multiprocessing import Process
# 多进程的队列
from multiprocessing import Queue
def download(name, queue: Queue):print(f'{name}开始下载!')time.sleep(1)print(f'{name}下载完成!')# return name+'数据'# queue.put(name+'数据')     # 往进程中添加数据queue.put([f'{name}10', f'{name}20'])if __name__ == '__main__':q = Queue()p1 = Process(target=download, args=('肖生克的救赎', q))p2 = Process(target=download, args=('阿甘正传', q))p1.start()p2.start()# p1.join()# p2.join()# 获取两个进程产生的数据print(q.get())      # 获取队列中的数据;如果获取的时候队列中没有数据会阻塞线程一直等,等到有数据或者超时为止print(q.get())# print(q.get())# print(q.get(timeout=2))

线程间有效通信
线程间通信:定义一个全局的容器,在子线程的函数中直接在全局容器中添加数据

from queue import Queue
from threading import Thread
import timedef download(name):print(f'{name}开始下载')time.sleep(1)print(f'{name}下载结束')q.put(f'{name}数据')if __name__ == '__main__':q = Queue()t1 = Thread(target=download, args=('沉默的羔羊',))t2 = Thread(target=download, args=('怦然心动',))t1.start()t2.start()# t1.join()# t2.join()print(q.get())print(q.get())

进程池

from multiprocessing import Poolimport timedef download(name):print(f'{name}开始下载')time.sleep(1)print(f'{name}下载结束')if __name__ == '__main__':# 1.创建进程池对象pool = Pool(maxtasksperchild=3)# 2.添加任务# 1)添加单个任务# apply - 添加同步执行# apply_async  - 添加异步执行pool.apply_async(download, args=('肖生克的救赎',))pool.apply_async(download, args=('触不可及',))# 2)同时添加多个任务# pool.map(download, ['V字仇杀队', '恐怖游轮', '林中小屋'])# 3.关闭pool.close()   # 停止添加任务# pool.apply(download, args=('摔跤吧,爸爸',))# 4. 等待pool.join()

2021.04.08 线程和进程的使用相关推荐

  1. E.04.08 They Survived Taiwan’s Train Crash. Their Loved Ones Did Not.

    2021.04.08 文章目录 [课程导读] [英文原文] [外刊原文] [课程导读] 4月2日,台铁太鲁阁号列车,行至花莲大清水隧道时发生严重脱轨事故.截至目前,车上350余名乘客中,死亡人数达到5 ...

  2. 2012-5-3 线程和进程的区别

    进程和线程的区别 http://www.cnblogs.com/lmule/archive/2010/08/18/1802774.html 简而言之,一个程序至少有一个进程,一个进程至少有一个线程. ...

  3. python 判断线程状态_Python 线程和进程

    前言 学编程,谁没有为线程折腾过啊. 目录 线程与进程 线程与进程是操作系统里面的术语,简单来讲,每一个应用程序都有一个自己的进程. 操作系统会为这些进程分配一些执行资源,例如内存空间等. 在进程中, ...

  4. 2021年 第12届 蓝桥杯 Java B组 省赛真题详解及小结【第1场省赛 2021.04.18】

    蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[题目下载.2013年(第4届)~2020年(第11届)] CSDN 蓝桥杯 专栏 2013年 第04届 蓝桥杯 Java B组 省赛真题详解及小结 ...

  5. Symbian操作系统中的线程和进程

    在Symbian操作系统中,每个进程都有一个或多个线程.线程是执行的基本单位.一个进程的主线程是在进程启动时生成的. Symbian属于抢占式多任务操作系统,这意味着每个线程都有自己的执行时间,直到系 ...

  6. 操作系统课程设计-线程和进程的同步与互斥

    操作系统的课程设计 多线程和多进程同步方法解决水果分配问题: 水果分配的问题: 桌上有一只盘子,每次只能放入5只水果.爸爸专放苹果, 妈妈专放橘子,一个儿子专等吃盘子中的橘子,一个女儿专等吃盘子中的苹 ...

  7. python线程退出或应用程序请求_Python 线程和进程

    前言 学编程,谁没有为线程折腾过啊. 目录 线程与进程 线程与进程是操作系统里面的术语,简单来讲,每一个应用程序都有一个自己的进程. 操作系统会为这些进程分配一些执行资源,例如内存空间等. 在进程中, ...

  8. Python(十三)线程和进程

    线程与进程 线程与进程是操作系统里面的术语,简单来讲,每一个应用程序都有一个自己的进程. 操作系统会为这些进程分配一些执行资源,例如内存空间等.在进程中,又可以创建一些线程,他们共享这些内存空间,并由 ...

  9. 草根学Python(十三)线程和进程

    前言 拖了好久,不过还是得坚持.喜欢本文的话可以加下公众号[于你供读]. 目录 线程与进程 线程与进程是操作系统里面的术语,简单来讲,每一个应用程序都有一个自己的进程. 操作系统会为这些进程分配一些执 ...

最新文章

  1. SAP 物料XXXXX的强制帐户设置 (输入帐户设置类别) 的问题解决方法
  2. 在PEA上海做演讲主题:大型、高负载网站架构和应用初探
  3. [翻译] InstagramPhotoPicker
  4. 淘宝API代码c#实例(摘)
  5. 金蝶k3服务器的操作系统,金蝶k3服务器配置工具
  6. 数控铣削图案及编程_数控铣削编程与操作设计有全套图纸.doc
  7. MICIN、LINEIN、LINEOUT、HPOUT、麦克风、耳机、扬声器一次说明白
  8. UVALive7461 - Separating Pebbles 判断两个凸包相交
  9. windows server测评 等保2.0
  10. 【软件工程系列】结构化需求分析
  11. 树莓派3B 之IIC通信
  12. 35岁以后的Android程序员出路在哪里?大牛最佳总结
  13. 智能感知与学习(六):识别系统
  14. 惠普win10一键还原_惠普win10一键还原怎么用 - 卡饭网
  15. 如何实现一篇数据新闻报道
  16. 24、抽象方法和抽象类的写法
  17. 【java8 stream操作List集合】
  18. ABAP 开发系列(08): SAP Open SQL
  19. 数据库之Timestamp 的用法
  20. 奇迹mu GM命令管理器修改

热门文章

  1. 长见识了: 一篇文章带你看懂 硬盘数据恢复软件的原理
  2. 责任链模式之开发新游戏的审批过程
  3. 图卷积(一)-图结点表示
  4. 机器人绳索英雄下载苹果手机_警察机器人绳索英雄
  5. 2022年情人节送男朋友什么礼物好?情人节礼物推荐
  6. linux c 语言小结
  7. 高可用 Prometheus:问题集锦
  8. 三国杀新服务器修改的武将,强度削弱 三国杀新标准版五大武将修改
  9. 泰坦尼克号的生存分析
  10. Android小技巧之创建桌面快捷方式(已适配8.0)