'''
多进程:
multiprocessing.Process(target=模块或类 ,args=())
Queue():队列
跟线程完全不相同
q = multiprocessing.Queue
m1 = multiprocessing.Process(target=f,#args=queue#)重要
因为进程不能共享数据 需要把Q传到子进程中才能共享数据 也就是可以put出来内容
创建进程 类式调用 进程之间的关系 queue 肯定能用上 微博就是用queue做的
Pipe: 管道
prent_conn主进程,child_conn子进程 = multiprocessing.Pipe()
m1 = multiprocessing.Process(target=f,args(child_conn)) 把子进程参数f传给子进程
prent_conn.recv 等待子进程发送的数据
发送的是子进程 接收的是主进程 也可以子进程发给住进程 这样就是可以完成通信了
Manager:数据共享
from multiprocessing import process,managers
with multiprocessing.Manager() as manager:
d = manager.dict() #创建字典
l = manager.list() #创建列表
通过字典和列表的方法 进程之间的共享数据
协程:用得好完全可以替代线程
底层协程:
协程是一种用户态的轻量级线程 单线程
yield支持下的协程 yield生成器对象
def f():
print('ok1')
yield 5这个可以有返回值 加上yield就是一个生成器对象
print('ok1')
yield 6
gen = f()
next(gen) next进入有yield的函数 拿到返回值 next只能拿到1个返回值
count = yield 5
x = gen.send(10) 把10赋给count X拿到6
不用next x = gen.send(不能传值要传个None)不是非空 必须是空 跟next是一样的
con = consumer('c1') 创建一个生成器对象
con2 = consumer('c2') 同上
p = producer() 执行函数,p是函数的返回值
Python的协程模块:
grl.switch(): 做的就是切换
from gevent import greenlet
def text1():
grl.switch() 做的就是切换
def text2():
gr1.seitch()
gr1 = greenlet(text1) #拿到greenlet对象
gr2 = greenlet(text2)
gr?.seitch() 调用谁的switch 就先执行谁的 目的就是切换索要执行的gr1 or gr2
gevent.hoinall:
gevent.hoinall([
gevent.spawn(f=函数,httpwww.baidu.com) 用法
gevent.spawn(bar)
])
gevent。sleep()模拟io阻塞 不能用time 单线程 就等待了 time是模拟cpu的
gevent.hoinall()这个方法就是遇到io阻塞 就切换
ctime就是北京时间
详见 爬校花网
协程非常牛 非常好
'''
#爬校花网
# from gevent import monkey
#
# monkey.patch_all() #加速模块 最大程度的监听io阻塞
# import gevent
# from urllib.request import urlopen
# def foo(url):
# print('GRT:%s'%url)
# resp = urlopen(url)
# data = resp.read()
# print('%d bytes received from %s'%(len(data)),url)
# foo(网址)
'''
import multiprocessing
with multiprocessing.Manager() as manager:
d = manager.dict() #创建字典
l = manager.list() #创建列表
import multiprocessing
def f():
print('11111111')
if __name__ == '__main__':
q = multiprocessing.Queue
m1 = multiprocessing.Process(target=f)
m1.start()
multiprocessing.Pipe()
'''