进程、数据共享、进程锁、进程池、requests模块和bs4(beautifulsoup)模块
一、进程
1、进程间数据不共享,如下示例:
import multiprocessing
data_list = []
def task(arg):
data_list.append(arg)
print(data_list) # 每个进程都有自己的一个列表 def run():
for i in range(10):
p = multiprocessing.Process(target=task,args=(i,))
p.start() if __name__ == '__main__':
run()
2、进程的常用功能
import multiprocessing
import time def task(arg):
time.sleep(2)
print(arg) def run():
print(11111111)
p1 = multiprocessing.Process(target=task,args=(1,))
p1.start()
p1.join(6) # 等待进程完成,最多等6秒
print(22222222) p2 = multiprocessing.Process(target=task,args=(2,))
p2.start()
p2.join()
print(33333333) if __name__ == '__main__':
run()
join
import multiprocessing
import time def task(arg):
time.sleep(2)
print(arg) def run():
print(11111111)
p1 = multiprocessing.Process(target=task,args=(1,))
p1.daemon = False # 等待进程完成,默认
p1.start()
print(22222222) p2 = multiprocessing.Process(target=task,args=(2,))
p2.daemon = True # 不等进程完成
p2.start()
print(33333333) if __name__ == '__main__':
run()
daemon
import multiprocessing
import time def task(arg):
time.sleep(2)
p = multiprocessing.current_process() # 获取当前进程
name = p.name
id1 = p.ident # 获取进程id
id2 = p.pid # 获取进程id
print(arg,name,id1,id2) def run():
print(11111111)
p1 = multiprocessing.Process(target=task,args=(1,))
p1.name = 'pp1' # 为进程设置名字pp1
p1.start()
print(22222222) p2 = multiprocessing.Process(target=task,args=(2,))
p2.name = 'pp2' # 为进程设置名字pp2
p2.start()
print(33333333) if __name__ == '__main__':
run()
name / current_process() / ident/pid
二、数据共享(内存级别)
1、Queue
import multiprocessing
q = multiprocessing.Queue()
def task(arg,q):
q.put(arg)
def run():
for i in range(10):
p = multiprocessing.Process(target=task, args=(i, q,))
p.start()
while True:
v = q.get()
print(v)
run()
linux示例:
import multiprocessing
def task(arg,q):
q.put(arg) if __name__ == '__main__':
q = multiprocessing.Queue()
for i in range(10):
p = multiprocessing.Process(target=task,args=(i,q,))
p.start()
while True:
v = q.get()
print(v)
windows示例:
2、Manager
import multiprocessing
m = multiprocessing.Manager()
dic = m.dict() def task(arg):
dic[arg] = 100 def run():
for i in range(10):
p = multiprocessing.Process(target=task, args=(i,))
p.start()
input('>>>')
print(dic.values()) if __name__ == '__main__':
run()
linux示例:
import multiprocessing
import time def task(arg,dic):
time.sleep(2)
dic[arg] = 100 if __name__ == '__main__':
m = multiprocessing.Manager()
dic = m.dict() process_list = []
for i in range(10):
p = multiprocessing.Process(target=task, args=(i,dic,))
p.start()
process_list.append(p) while True:
count = 0
for p in process_list:
if not p.is_alive(): # 如果某进程已经执行完毕,则count加1
count += 1
if count == len(process_list):
break
print(dic)
windows示例:
三、进程锁
进程锁同线程锁的种类和用法一样,参见线程锁。如下是进程锁RLock示例:
import time
import multiprocessing lock = multiprocessing.RLock() def task(arg):
print('鬼子来了')
lock.acquire()
time.sleep(2)
print(arg)
lock.release() if __name__ == '__main__':
p1 = multiprocessing.Process(target=task,args=(1,))
p1.start() p2 = multiprocessing.Process(target=task, args=(2,))
p2.start()
问题1:为什么要加进程锁?
线程锁是为了在线程不安全的时候,为一段代码加上锁来控制实现线程安全,即线程间数据隔离;
进程间的数据本来就是隔离的,所以一般不用加锁,当进程间共用某个数据的时候需要加锁;
四、进程池
import time
from concurrent.futures import ProcessPoolExecutor def task(arg):
time.sleep(2)
print(arg) if __name__ == '__main__':
pool = ProcessPoolExecutor(5) # 创建一个进程池
for i in range(10):
pool.submit(task,i)
五、requests模块和bs4(beautifulsoup)模块 -- (初识爬虫)
1、安装:
pip3 install requests
pip3 install beautifulsoup4
2、示例代码(爬取抽屉网的标题和链接):
import requests
from bs4 import BeautifulSoup
from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor # 模拟浏览器发送请求
# 内部创建 sk = socket.socket()
# 和抽屉进行socket连接 sk.connect(...)
# sk.sendall('...')
# sk.recv(...)
def task(url):
print(url)
r1 = requests.get(
url=url,
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.92 Safari/537.36'
}
)
# 查看下载下来的文本信息
soup = BeautifulSoup(r1.text,'html.parser')
# print(soup.text)
content_list = soup.find('div',attrs={'id':'content-list'})
for item in content_list.find_all('div',attrs={'class':'item'}):
title = item.find('a').text.strip()
target_url = item.find('a').get('href')
print(title,target_url) def run():
pool = ThreadPoolExecutor(5)
for i in range(1,50):
pool.submit(task,'https://dig.chouti.com/all/hot/recent/%s' %i) if __name__ == '__main__':
run()
总结:
1)以上示例进程和线程哪个好?
线程好,因为socket属于IO请求,不占用CPU,所以用多线程即节省资源又提高效率;
2)requests模块模拟浏览器发送请求:
requests.get( . . . ) 本质:
创建socket客户端
连接【阻塞】
发送请求
接收请求【阻塞】
断开连接
进程、数据共享、进程锁、进程池、requests模块和bs4(beautifulsoup)模块的更多相关文章
- bs4——BeautifulSoup模块:解析网页
解析由requests模块请求到的网页 import requests from bs4 import BeautifulSoup headers = {'User-Agent': 'Mozilla/ ...
- [并发编程 - socketserver模块实现并发、[进程查看父子进程pid、僵尸进程、孤儿进程、守护进程、互斥锁、队列、生产者消费者模型]
[并发编程 - socketserver模块实现并发.[进程查看父子进程pid.僵尸进程.孤儿进程.守护进程.互斥锁.队列.生产者消费者模型] socketserver模块实现并发 基于tcp的套接字 ...
- Day9 进程同步锁 进程队列 进程池 生产消费模型 进程池 paramike模块
进程同步锁: 当运行程序的时候,有可能你的程序同时开多个进程,开进程的时候会将多个执行结果打印出来,这样的话打印的信息都是错乱的,怎么保证打印信息是有序的呢? 其实也就是相当于让进程独享资源. fro ...
- python基础-12 多线程queue 线程交互event 线程锁 自定义线程池 进程 进程锁 进程池 进程交互数据资源共享
Python中的进程与线程 学习知识,我们不但要知其然,还是知其所以然.你做到了你就比别人NB. 我们先了解一下什么是进程和线程. 进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CP ...
- python多进程,进程池,数据共享,进程通信,分布式进程
一.操作系统中相关进程的知识 Unix/Linux操作系统提供了一个fork()系统调用,它非常特殊.普通的函数调用,调用一次,返回一次,但是fork()调用一次,返回两次,因为操作系统自动把当前 ...
- 多进程之multiprocessing模块、守护进程、互斥锁
目录 1. multiprocessing 模块介绍 2. Process类的介绍 3. Process类的使用 4. 守护进程 5. 进程同步(锁) 1. multiprocessing 模块介绍 ...
- python 进程锁 生产者消费者模型 队列 (进程其他方法,守护进程,数据共享,进程隔离验证)
#######################总结######### 主要理解 锁 生产者消费者模型 解耦用的 队列 共享资源的时候 是不安全的 所以用到后面的锁 守护进程:p.daem ...
- Python11/12--GIL/互斥锁/进程池
GIL1.全局解释器锁? 锁就是线程里面那个锁 锁是为了避免资源竞争造成数据的错乱 2.python程序的执行过程? 1.启动解释器进程 python.exe 2.解析你的py文件并执行它 每个py程 ...
- 并发 --- 2 进程的方法,进程锁 守护进程 数据共享 进程队列, joinablequeue模型
一.进程的其他方法 1. .name 进程名 (可指定) 2. .pid 进程号 3. os.getpid 在什么位置就是什么的进程号 4. .is ...
随机推荐
- oci pool
http://wenku.baidu.com/link?url=uS8tWxcs7MxNdx5HiGCEyvXsCj0zF5-7pCRVQtlRH5eVuMmSKKqNziSc2O_pyepnnuc_ ...
- tcp/ip--IP 协议首部格式与其配套使用的四个协议(ARP,RARP,ICMP,IGMP)
IP 数据报首部 最高位在左边,记为0 bit:最低位在右边,记为31 bit 版本: 占 4 位,指 IP 协议的版本目前的 IP 协议版本号为 4 (即 IPv4) 首部长度: 占4位,可表示的最 ...
- 指尖上的电商---(8)Solr中Facet的使用方法
在大型电子商务站点中,在商品列表页,我们都能够看到商品按分类,品牌,价格的分类显示,例如以下图,这些我们能够使用solr中的facet功能实现. facet的基本功能就是对搜索结果中的商品进行分类. ...
- 转: android emulator 命令详解
在命令行输入: emulator -help,即可显示emulator支持的所有命令. Android Emulator usage: emulator [options] [-qemu args] ...
- CSS实现子级窗口高度随低级窗口高度变化及js控制左右容器高度一致
纯粹使用使用height:100%;或者height:auto;来定义内部容器自适应高度,都无法实现让内部容器高度随着外部父容器高度变化而变化,所以我们必需要使用position绝对定位属性来配合协助 ...
- 信号处理的好书Digital Signal Processing - A Practical Guide for Engineers and Scientists
诚心给大家推荐一本讲信号处理的好书<Digital Signal Processing - A Practical Guide for Engineers and Scientists>[ ...
- iOS_16_控制器切换_modal_storyboard拖线的方式
终于效果图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJlX2VtaW5lbnQ=/font/5a6L5L2T/fontsize/400/fill ...
- PILE读书笔记_进程环境
进程是操作系统运行程序的一个实例, 也是操作系统分配资源的单位. 在Linux环境中, 每个进程都有独立的进程空间, 以便对不同的进程进行隔离, 使之不会互相影响. atexit函数 #include ...
- js使用正则表达式验证身份证格式
function checkIdentity(identity){ var reg = /^[1-9]{1}[0-9]{14}$|^[1-9]{1}[0-9]{16}([0-9]|[xX])$/; i ...
- 配置HADOOP_HOME
配置HADOOP_HOME export HADOOP_HOME=/usr/hadoop-1.2.0export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sb ...