首页 > 系统相关 >python基础 如何查看进程的id号、队列的使用(queue)、解决进程之间隔离关系、生产者消费者模型、线程

python基础 如何查看进程的id号、队列的使用(queue)、解决进程之间隔离关系、生产者消费者模型、线程

时间:2023-07-06 15:33:19浏览次数:42  
标签:__ 队列 name python queue print 线程 进程

如何查看进程id号

进程都有几个属性:进程名、进程id号(pid-->process id)
每一个进程都有一个唯一的id号, 通过这个id号就能找到这个进程

import os
import time
def task():
    print("task中的子进程号:", os.getpid())
    print("主进程中的进程号:", os.getppid())  # parent
    time.sleep(20)

from multiprocessing import Process

if __name__ == '__main__':
    p = Process(target=task, )
    p.start()
    # 如何查看p进程的进程号
    print("子进程的进程号:", p.pid)  # 217164
    # 如何查看主进程的进程号:
    print("主进程的进程号:", os.getpid()) # os.getgid()这一句代码写在哪个进程下,输出的就是这个进程的进程号
    time.sleep(10)

队列的使用(queue)

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

队列:先进先出
# 怎么样能够得到一个队列呢?
在python中,内置的有一个类,Queue

from multiprocessing import Queue

if __name__ == '__main__':
    q = Queue(3)  # 队列的大小默认很大
    # 1. 如何入队、
    """obj, block=True, timeout=None"""
    q.put('hellowrold1')
    q.put('helloworld2')
    q.put('helloworld3')
    # q.put('helloworld4', block=False)  # 如果你知道了block参数,当队列满的时候,放不进去的时候,直接报错
    # q.put('helloworld4', timeout=3)  # 如果你知道了timeout参数,当往队列中放入数据的时候,等待3秒,如果放不进去,直接报错
    # q.put_nowait('helloworld4')  # 往队列中放入数据的时候,放不进去直接报错, 指定了参数:block=False

    # 2. 出队
    # print(q.get())
    # print(q.get())
    print(q.get())
    """ block=True, timeout=None"""
    # print(q.get(block=False))
    # print(q.get(timeout=3))

    # q.get_nowait() #
    # print(q.qsize()) # 队列中剩余的数据量, 这个方法的结果有点不准确.
    # print(q.empty())
    # print(q.full())

解决进程之间的数据隔离问题

def task(q):
    a  = 1
    q.put("子进程写入的数据111")
    q.put(a)


from multiprocessing import Process,Queue

if __name__ == '__main__':
    q = Queue(3)
    p = Process(target=task,args=(q, ) )
    p.start()
    """
        我在子进程中放入一个数据,然后在主进程中取出这个数据,如果能去得到,就说明通信了,如果取不到就说明不通信
    """
    # 在主进程中取出子进程写进去的数据
    print(q.get())
    print(q.get())

现在队列中的数据在哪里存着? 在内存中存着,当数据量很大的时候,很占用我们机器的内存
 以后我们可能会使用专业的消息队列: kafka、rabbitmq、rocketmq等专业的消息队列
当前使用较多的消息队列有:RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMq等

生产者消费者模型

它不是只存在于Python中,在其他语言中也是有的,甚至于他跟语言就没有关系

在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题,该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度。

版本4: 多生产者 少消费者的情况
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)

队列可能会出现什么问题,如何解决的?
 队列积压问题,队列里面的数据不能够被及时的消费掉造成的问题
把队列中的数据消费掉,以后我们会有专业的队列工具,是一个网站,手动的处理

线程理论

进程是一个任务的执行过程,在这个过程中实际做事的是线程,线程是开在进程里面的,需要先有进程,在有线程,一个进程中至少有一个线程,当然,也可以有多个线程。

进程是资源分配的基本单位,线程是CPU执行的最小单位

进程和线程都是有操作系统来调度的,协程它是有程序员来调度的。

进程 >>> 线程 >>> 协程
资源消耗是最多的 >>> 线程的资源 >>> 协程的

我们学了进程和线程之后,以后到底是开多进程还是开多线程呢? """ GIL锁相关

如何开启线程

def task():
    print("task执行了")  # task执行了


from multiprocessing import Process
from threading import Thread

if __name__ == '__main__':
    t = Thread(target=task)
    t.start()
    
from multiprocessing import Process
from threading import Thread
import threading

if __name__ == '__main__':
    """
        target=None, name=None,
                 args=(), kwargs=None, *, daemon=None
                 
        name='ly_1': 修改线程名称
        
    """
    t = Thread(target=task, name='ly_1', args=('kevin', 'jason' ), kwargs={'age':18})
    # t.daemon = True
    # t.setDaemon(True)  # 守护线程:主线程结束,子线程跟着结束
    t.start()

    # print(t.name)  # Thread-1
    # print(123)

    #####几个方法
    # print(t.isAlive())
    # print(t.is_alive())
    # print(t.getName())
    # print(t.name)
    # t.setName('ly_2')
    # print(t.getName())
    print(threading.currentThread())  # <_MainThread(MainThread, started 110848)>

如何开启多线程

def task(i):
    print(i)


from threading import Thread
if __name__ == '__main__':
    tt = []
    for i in range(5):
        t = Thread(target=task, args=(i, ))
        t.start()
        tt.append(t)
    for j in tt:
        j.join()
        
    print("123")

进程和线程的比较

1. 进程的开销远远大于线程的开销
2. 进程之间的数据是隔离的,线程之间的数据呢? 线程之间的数据是共享的,严格的来说:同一个进程下的线程之间的数据是共享的
3. 想让不同进程之间的线程之间的数据共享------->还是让进程之间通信------->线程之间也通信了--->队列

 

标签:__,队列,name,python,queue,print,线程,进程
From: https://www.cnblogs.com/shanghaipudong/p/17532286.html

相关文章

  • TDengine 3.0.4.0 重要特性之 Python UDF 实战分享
    TDengine3.0.4.0发布了一个重要特性:支持用Python语言编写的自定义函数(UDF)。这个特性极大节省了UDF开发的时间成本。作为时序大数据处理平台,不支持PythonUDF显然是不完整的。UDF在实现自己业务中特有的逻辑时非常有用,比如量化交易场景计算自研的交易信号。本文内容由浅......
  • Python3 使用confluent_kafka实现异步向Kafka中写入数据
    使用的python包pipinstallconfluent-kafka创建topic&&扩充partition#!/usr/bin/envpython#-*-coding:utf-8-*-#@Time:2023/2/616:48#@Software:PyCharm__author__="JentZhang"importjsonfromconfluent_kafka.adminimportAdminClient,......
  • Python 爬虫实战:驾驭数据洪流,揭秘网页深处
    爬虫,这个经常被人提到的词,是对数据收集过程的一种形象化描述。特别是在Python语言中,由于其丰富的库资源和良好的易用性,使得其成为编写爬虫的绝佳选择。本文将从基础知识开始,深入浅出地讲解Python爬虫的相关知识,并分享一些独特的用法和实用技巧。本文将以实际的网站为例,深入阐述各......
  • Python QT5 使用笔记[随意记]
    self.rkDialog.tableWidget.findItems() 是一个在Qt中用于在表格小部件(TableWidget)中查找匹配项的方法。它的作用是查找满足特定条件的单元格项,并返回一个包含这些项的列表。这个方法的用法如下: items=self.rkDialog.tableWidget.findItems(text,flags) 参数说明:......
  • 如何实现Python中定义一个全局列表的具体操作步骤
    Python中定义一个全局列表在Python中,全局变量是在整个程序中都可以访问的变量。全局变量可以在任何函数内部进行读取和修改。这在某些情况下是非常有用的,尤其是当我们想要在多个函数或模块之间共享数据时。如何定义一个全局列表?要在Python中定义一个全局列表,我们只需要在函数外......
  • 如何实现Python中打印数字正方形的具体操作步骤
    Python中打印数字正方形的实现简介在Python中,我们可以使用循环语句和字符串格式化来实现打印数字正方形。本文将指导你一步一步实现这个过程。步骤下面是实现打印数字正方形的步骤:步骤描述1提示用户输入正方形的边长2使用循环打印每一行的数字3在每一行中,使......
  • 如何实现Python找出字符串变量中所有大写的A.Z的具体操作步骤
    Python找出字符串变量中所有大写的A-Z作为一名经验丰富的开发者,你很荣幸地被指派教导一位刚入行的小白,告诉他如何在Python中找出字符串变量中的所有大写字母A-Z。下面是一个详细的步骤指南,帮助他完成这个任务。整体流程我们将整个过程分为以下几个步骤:步骤描述1提取......
  • Python怎么调中文 这个问题怎么解决?
    Python怎么调中文在使用Python处理中文文本时,我们常常会遇到一些编码和字符处理的问题。本文将介绍如何通过一些常用的方法和工具来解决这些问题,并提供代码示例来帮助读者更好地理解。问题描述假设我们有一个文本文件,其中包含了一些中文文本,我们想要对这些文本进行处理,例如统计......
  • 如何实现Python隐藏调用的具体操作步骤
    Python隐藏调用的实现概述Python隐藏调用是指通过某种方法,将函数或类隐藏起来,使其在外部无法直接访问和调用。这样做的目的是为了提高代码的安全性和可维护性。在本文中,我将向你介绍如何实现Python隐藏调用并提供详细的步骤和代码示例。实现步骤下面是实现Python隐藏调用的具体......
  • 如何实现Python相似度的意义的具体操作步骤
    Python相似度的意义及实现方法1.引言在日常开发中,我们经常会遇到需要比较两个或多个文本、字符串或者数据集的相似度的情况。Python提供了多种方法来计算相似度,这有助于我们解决各种实际问题,比如文本匹配、数据聚类等。本文将介绍Python相似度的意义以及实现方法,并通过一个具体......