查看进程号、队列的使用

如何查看进程的id号

进程都有几个属性:进程名进程号

每一个进程都有一个唯一的id号,通过这个id号就能找到这个进程

linux杀进程:
1.kill -9 进程号
2.pkill 进程名
# 查看进程号 tasklist
windows杀进程:
1.任务管理器手动关闭
2.taskkill /pid 进程号 -f

查看进程号需要用到os模块

1.pid

在进程中产的进程的进程号,通过进程+点语法+pid实现p.pid

2.getpid

查看当前进程号,通过os模块+getpid实现os.getpid()

3.getppid

查看产生当前进程的进程的进程号,通过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())  # 查看当前进程的进程号

队列的使用(Queue)

  常见的数据结构:链表、单链表、双链表、循环链表、栈、队列、树、二叉树、平衡二叉树、、红黑树、b树、b+树、b-树、图等

怎么得到一个队列?

队列的特点:先进进出

python中有个个内置的类,Queue

1.定义队列

先导入模块fron multiprocessing improt Queue
q = Queue(n)定义一个队列并定义队列大小,队列的大小就是n,如果n不填责就是队列的默认大小,非常大

2.加入队列
  1. q.put(数据)
     将数据放入q队列中,使用一次放入一个数据;如果队列满了放数据会在外面进行等待,等队列里有数据取出再放入
参数
1. block = True,将值改为False时,放入该数据时如果队列满了不再等待,而是直接报错。
2. timeout = 3,放入数据时会等待等于的数字秒,如果时间到后队列满了会直接报错
  1. q.put_nowait(数据)
     往队列中放入数据时,如果队列满了会直接报错
3.出队
  1. q.get()
     将队列q中的数据取出来,使用一次取一次,当队列为空时,会等待,等待数据放入队列后取出
参数
1. block = True ,将值改为False时,取出数据时如果队列空了不再等待,而是直接报错。
2. timeout = 3,取出数据时会等待等于的数字秒,如果时间到后,队列为空会直接报错
  1. q.get_nowait()
     往队列中放入数据时,如果队列满了会直接报错、
4.q.qsize()

q.qsize(),查看队列剩余的数据量,这个方法不太准确

5.q.empty()

q.empty()查看队列是不是为空,返回布尔值

6.q.full()

q.full(),查看队列是不是满的,返回布尔值

7.q.close()

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)

你可能感兴趣的:(网络编程和并发编程,python,网络)