进程、数据共享、进程锁、进程池、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 ...
随机推荐
- Windows RabbitMQ 添加用户、设置角色和权限 (包含无法添加的错误处理)
添加账号密码 rabbitmqctl.bat add_user test 123456 添加角色 rabbitmqctl.bat set_user_tags test administrator 授权 ...
- springboot学习(八) 使用jpa访问数据库
1.添加maven依赖 <dependency> <groupId>mysql</groupId> <artifactId>mysql-connecto ...
- Linux C 中 open close read write 使用实例
这里实现的是将文件cody.txt中的内容拷贝到to_cody.txt中去. 1 /* ======================================================== ...
- mongo aggregate
https://cnodejs.org/topic/59264f62855efbac2cf7a2f3 背景 现有1000条学生记录,结构如下: { name:String,//名称 clazz:{ty ...
- Apache配置文件详解
1.1 ServerRoot 配置 [ServerRoot "" 主要用于指定Apache的安装路径,此选项参数值在安装Apache时系统会自动把Apache的路径写入.Windo ...
- Shell脚本与vi编辑器:vi启动与退出、工作模式、命令大全
Vi简介 Vi是一种广泛存在于各种UNIX和Linux系统中的文本编辑程序. Vi不是排版程序,只是一个纯粹的文本编辑程序. Vi是全屏幕文本编辑器,它没有菜单,只有命令. Vi不是基于窗口的,所以, ...
- UML类图详解_关联关系_一对多
对于一对多的示例,可以想象一个账户可以多次申购.在申购的时候没有固定上限,下限为0,那么就可以使用容器类(container class)来搞,最常见的就是vector了. 下面我们来看一个“一对多” ...
- unity free asset
Unity Test Tools https://www.assetstore.unity3d.com/#/content/13802 Sample Assets (beta) https://www ...
- PLSQL快捷键设置
1.在PL/SQL Developer中编写sql语句时,如果无法自动提示字段那是一件痛苦的事情,工作效率又低,在此演示下如何在PL/SQL Developer工具中自动提示字段,让开发者省时又省心, ...
- RTT驱动实现步骤
设备驱动实现步骤: 1. 按照RT-Thread对象模型,扩展一对象有两种方式: 1)定义自己的私有数据结构,然后赋值到RT-Thread设备控制空的user_data指针上: 2)从struct r ...