Python勉強_10

Python_10_20200303


变更履历

日期版本内容作者备注
2020/03/03v1.00初版做成author素质教育漏网之鱼

线程的使用

io操作不占CPU
计算占CPU
python多线程,不适合cpu密集型操作的任务,适合io密集型操作

多进程
import multiprocessing
#语法同线程
进程间通信

使用进程队列:
父进程队列,子进程队列时两个不同的地址空间
但中间参数q,操作序列化和反序列化使其内容一致

from multiprocessing import Process,Queue
def f(q):
	q.put("hello")
q=Queue()
p=Process(target=f,args=(q,))
p.start()
p.join()

使用管道:

from multiprocessing import Process,Pipe
def f(conn):
	conn.send("hello")
	conn.close()
parent_conn,child_conn=Pipe()
p=Process(target=f,args=(child_conn,))
p.start()
print(parent_conn.recv())
p.join()

以上仅用于数据传递,并没有实现共享
使用Manager,已经自动加锁

from multiprocessing import Process,Manager
import os
def f(d,l):
	d[os.getpid()]=os.getpid()
	l.append(os.getpid())
with Manager() as manager:
	d=manager.dict()
	l=manager.list(range(5))
	p_list=[]
	for i in range(10):
		p=rocess(target=f,args=(d,l))
		p.start()
		p_list.append(p)
	for res in p_list:
	 res.join()
print(d)
print(l)	
进程池
from multiprocessing import Process,Pool
import time
def Foo(i):
	time.sleep(2)
	print("in process:",os.getpid())
	return i+100
def done(arg):
	print("in process:",os.getpid())
if __name__=='__main__':
pool=Pool(5)#允许同时存在5个进程,现在可执行5个,其他的挂起
for i in range(10):
	pool.apply(func=Foo,args=(i,))#同步执行
	pool.apply_async(func=Foo,args=(i,),callback=done)#同步执行,callback回调函数,由主进程调用
#先关闭,后等待
pool.close()
pool.join()

协程

微线程,一种挂起,优化切换,本质一种单线程,少IO操作
高并发,高扩展,低成本

g1=greenlet(func)
g1.switch()
#自动切换
gevent.sleep()

第一个爬虫
from urllib import request
import gevent
def f(url):
    print('GET:%s'%url)
    resp=request.urlopen(url)
    data=resp.read()
    f=open("url.html","wb")
    f.write(data)
    f.close()
    print('%d bytes received from %s.'%(len(data),url)
f("https://www.baidu.com")
爬虫加强
from gevent import monkey
monkey.patch_all()#io操作自动切换
IO多路复用

等待数据相应,等待内核数据拷贝

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值