进程之间的数据隔离
进程之间通信 Inter Process communication IPC
基于文件:同一台机器上的多个进程之间通信
基于socket的文件级别的通信来完成数据传递的
基于网络:同一台机器或多台机器上的多进程间通信
第三方工具(消息中间件) memcache、redis、rabbitmq、kafka
from multiprocessing import Queue, Process
def pro(q):
for i in range(5):
print(q.get())
def son(q):
for i in range(10):
q.put('hello%s' % i)
if __name__ == '__main__':
q = Queue()
p = Process(target=son, args=(q,))
p.start()
p = Process(target=pro, args=(q,))
p.start()
生产者消费者模型:一个放数据,一个取数据
爬虫的时候
分布式操作:celery
本质:就是让生产数据和消费数据的效率达到平衡且最大化效率
from multiprocessing import Queue, Process
import random
import time
def consumer(q):#消费者取到数据后才要进行某些操作
for i in range(10):
print(q.get())
def producer(q):#生产者:通常在放数据之前需要通过代码获取数据
for i in range(10):
time.sleep(random.random())
q.put(i)
if __name__=='__main__':
q=Queue()
c1=Process(target=consumer,args=(q,))
p1=Process(target=producer,args=(q,))
c1.start()
p1.start()
吃食物的例子说明更加完整的生产者-消费者模式
from multiprocessing import Queue, Process
import random
import time
def consumer(q, name): # 消费者取到数据后才要进行某些操作
# for i in range(20): # 改函数内部的值,才能确定,不符合开放封闭原则,while True:
# print('%s 吃了 %s' % (name, q.get()))
while True:
food = q.get()
if food:
print('%s 吃了 %s' % (name, food))
else:
break
def producer(q, name, food): # 生产者:通常在放数据之前需要通过代码获取数据
for i in range(10):
foodi = '%s%s' % (food, i)
print('%s 生产了%s' % (name, foodi))
time.sleep(random.random())
q.put(foodi)
if __name__ == '__main__':
q = Queue()
c1 = Process(target=consumer, args=(q, 'alex'))
p1 = Process(target=producer, args=(q, 'jane', 'cake'))
p2 = Process(target=producer, args=(q, 'tom', 'banana'))
c1.start()
p1.start()
p2.start()
p1.join()
p2.join()
q.put(None)
什么样的消费者是健康的消费者,外部控制停止
完善的消费者生产者模型