进程都有几个属性:进程名、进程号
每一个进程都有一个唯一的id号,通过这个id号就能找到这个进程
查看进程号需要用到os
模块
在进程中产的进程的进程号,通过进程+点语法+pid实现p.pid
查看当前进程号,通过os模块+getpid实现os.getpid()
查看产生当前进程的进程的进程号,通过os模块+getppig实现os.getppid()
import os
from multiprocessing import Process
def task():
print(os.getpid()) # 获取当前进程的进程号
print(os.getppid()) # 获取当前py文件的进程号(上一层进程)
if __name__ == '__main__':
p = Process(target=task)
p.start()
print(p.pid) # 查看p这个进程的进程号
print(os.getpid()) # 查看当前进程的进程号
常见的数据结构:链表、单链表、双链表、循环链表、栈、队列、树、二叉树、平衡二叉树、、红黑树、b树、b+树、b-树、图等
队列的特点:先进进出
python中有个个内置的类,Queue
先导入模块fron multiprocessing improt Queue
再q = Queue(n)
定义一个队列并定义队列大小,队列的大小就是n,如果n不填责就是队列的默认大小,非常大。
q.put(数据)
block = True
,将值改为False时,放入该数据时如果队列满了不再等待,而是直接报错。
timeout = 3
,放入数据时会等待等于的数字秒,如果时间到后队列满了会直接报错
q.put_nowait(数据)
q.get()
block = True
,将值改为False时,取出数据时如果队列空了不再等待,而是直接报错。
timeout = 3
,取出数据时会等待等于的数字秒,如果时间到后,队列为空会直接报错
q.get_nowait()
q.qsize()
,查看队列剩余的数据量,这个方法不太准确
q.empty()
查看队列是不是为空,返回布尔值
q.full()
,查看队列是不是满的,返回布尔值
q.close()
关闭队列
进程之间的通信可以借助于队列来实现,单现在数据都在内存中存储,当数据量很大的时候,很占用机器的内存
可以使用专业的消息队列:kafka、rabbitmq、rocket
当前使用消息较多的消息队列有:RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMQ
from multiprocessing import Process, Queue
def task(q):
# 在进程中放入数据
q.put('hhhh')
if __name__ == '__main__':
q = Queue(1)
p = Process(target=task, args=(q,))
p.start()
# 在另一个进程中取数据
print(q.get()) # hhhh
在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题,该模式通过平衡生产者线程和消费者线程的工作能力来提高程序的整体处理数据速度
def producer(q, name, food):
"""让生产者生产10个包子"""
for i in range(10):
"""生产的包子放在哪里? 队列里"""
q.put("生产者:%s,生产了第%s个 %s" % (name, i, food))
import time
time.sleep(0.1)
def consumer(q):
while True:
res = q.get()
# if q.empty():
# break
if res is None:
break
print(res)
from multiprocessing import Process, Queue
if __name__ == '__main__':
q = Queue(20)
# 4个生产者
p1 = Process(target=producer, args=(q, 'kevin', '包子'))
p2 = Process(target=producer, args=(q, 'jason', '豆浆'))
p3 = Process(target=producer, args=(q, 'tank', '面包'))
p4 = Process(target=producer, args=(q, 'oscar', '豆汁'))
p1.start()
p2.start()
p3.start()
p4.start()
# 两个消费者
p5 = Process(target=consumer, args=(q,))
p6 = Process(target=consumer, args=(q,))
p5.start()
p6.start()
p1.join()
p2.join()
p3.join()
p4.join()
"""放的None的数量超过消费者的数量就可以正常结束程序"""
q.put(None)
q.put(None)