一、进程

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)模块的更多相关文章

  1. bs4——BeautifulSoup模块:解析网页

    解析由requests模块请求到的网页 import requests from bs4 import BeautifulSoup headers = {'User-Agent': 'Mozilla/ ...

  2. [并发编程 - socketserver模块实现并发、[进程查看父子进程pid、僵尸进程、孤儿进程、守护进程、互斥锁、队列、生产者消费者模型]

    [并发编程 - socketserver模块实现并发.[进程查看父子进程pid.僵尸进程.孤儿进程.守护进程.互斥锁.队列.生产者消费者模型] socketserver模块实现并发 基于tcp的套接字 ...

  3. Day9 进程同步锁 进程队列 进程池 生产消费模型 进程池 paramike模块

    进程同步锁: 当运行程序的时候,有可能你的程序同时开多个进程,开进程的时候会将多个执行结果打印出来,这样的话打印的信息都是错乱的,怎么保证打印信息是有序的呢? 其实也就是相当于让进程独享资源. fro ...

  4. python基础-12 多线程queue 线程交互event 线程锁 自定义线程池 进程 进程锁 进程池 进程交互数据资源共享

    Python中的进程与线程 学习知识,我们不但要知其然,还是知其所以然.你做到了你就比别人NB. 我们先了解一下什么是进程和线程. 进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CP ...

  5. python多进程,进程池,数据共享,进程通信,分布式进程

    一.操作系统中相关进程的知识   Unix/Linux操作系统提供了一个fork()系统调用,它非常特殊.普通的函数调用,调用一次,返回一次,但是fork()调用一次,返回两次,因为操作系统自动把当前 ...

  6. 多进程之multiprocessing模块、守护进程、互斥锁

    目录 1. multiprocessing 模块介绍 2. Process类的介绍 3. Process类的使用 4. 守护进程 5. 进程同步(锁) 1. multiprocessing 模块介绍 ...

  7. python 进程锁 生产者消费者模型 队列 (进程其他方法,守护进程,数据共享,进程隔离验证)

    #######################总结######### 主要理解 锁      生产者消费者模型 解耦用的   队列 共享资源的时候 是不安全的 所以用到后面的锁 守护进程:p.daem ...

  8. Python11/12--GIL/互斥锁/进程池

    GIL1.全局解释器锁? 锁就是线程里面那个锁 锁是为了避免资源竞争造成数据的错乱 2.python程序的执行过程? 1.启动解释器进程 python.exe 2.解析你的py文件并执行它 每个py程 ...

  9. 并发 --- 2 进程的方法,进程锁 守护进程 数据共享 进程队列, joinablequeue模型

    一.进程的其他方法 1.   .name      进程名   (可指定) 2.  .pid     进程号 3.   os.getpid         在什么位置就是什么的进程号 4.   .is ...

随机推荐

  1. sql DATEPART() MONTH() convert() cast() dateadd() DATEDIFF() with(nolock)

    DATEPART() 函数用于返回日期/时间的单独部分,比如年.月.日.小时.分钟等等. 语法 DATEPART(datepart,date) date 参数是合法的日期表达式.datepart 参数 ...

  2. GBDT,随机森林

    author:yangjing ## time:2018-10-22 Gradient boosting decision tree 1.main diea The main idea behind ...

  3. Nginx通过CORS实现跨域(转)

    如果前端有nginx方向代理,跨域配置在前端反向代理nginx上 要做跨域域名限制 什么是CORS CORS是一个W3C标准,全称是跨域资源共享(Cross-origin resource shari ...

  4. Linux 性能监控 —— Load Average

    一. 简单介绍 top. uptime. cat /proc/loadavg 命令中 Load average: 4.90, 5.51, 5.77        整体含义: 正在执行的任务数量 + 排 ...

  5. 整理了一下浅墨大神的Visual C++/DirectX 9.0c的游戏开发手记

    还是非常棒的博客,只是没有一个文件夹.所以自己做了一个山寨文件夹在这里.便于随时查找. 前面31期从略. [Visual C++]游戏开发笔记三十二 浅墨DirectX提高班之中的一个 DirectX ...

  6. Vivado 与 Modelsim 联合仿真

    1 编译库 用命令行 用vivado工具 vivado 有很多 IP核的接口 已经与 ISE的核 不太一样了,比如fir ,接口就是这样的: fir_lp fir_lp_ip(    .aclk  ( ...

  7. Java客户端Jedis

    使用Jedis的Java客户端 maven依赖 <!-- jedis --> <dependency> <groupid>redis.clients</gro ...

  8. jquery通过val()取不到textarea中的值

    小编定义了一个textarea控件,却无法根据id取到textarea对象并赋值. 经过实验,得出了原因.代码如下: <!DOCTYPE html> <html> <he ...

  9. Unix 环境高级编程

    UNIX 环境高级编程 本书描述了UNIX系统的程序设计接口--系统调用接口和标准C库提供的很多函数. 与大多数操作系统一样,Unix为程序员运行提供了大量的服务--打开文件,读文件,启动一个新程序, ...

  10. Eclipse 添加书签

    Eclipse 添加书签 关于书签 Eclipse 中可以在编辑器的任意一行添加书签. 您可以使用书签作为提示信息,或者使用书签快速定位到文件中的指定的行. 添加书签 如果你想设置书签,你只需要在垂直 ...