首页 > 系统相关 >【转载】Python -- 多进程、多线程 的基本使用

【转载】Python -- 多进程、多线程 的基本使用

时间:2022-09-26 14:55:06浏览次数:65  
标签:__ Queue task name Python queue -- 任务 多线程

https://www.cnblogs.com/jiyu-hlzy/p/15948408.html

 

单进程单线程

import time


def production():
    """
    间隔一秒,模拟一秒生产一个任务,生产10个任务
    :return: 生产完毕,返回需要消费的任务
    """
    _tasks = 0
    while _tasks < 10:
        time.sleep(1)
        _tasks += 1
        print(f"生产任务:{_tasks}")

    return _tasks


def consumption(_tasks, _count):
    """
    间隔一秒,模拟一秒消费完一个任务
    :param _tasks: 需要消费的任务数
    :param _count: 已经消费的任务数
    :return:
    """
    while _tasks:
        time.sleep(1)
        _tasks -= 1
        _count += 1
        print(f"完成任务:{_count} \t\t\t 剩余任务:{_tasks}")


if __name__ == '__main__':
    # 已经消费的任务数
    finishedTasks = 0

    # 生产任务
    numberOfTasks = production()
    # 消费任务
    consumption(numberOfTasks, finishedTasks)



单进程多线程

import time
from queue import Queue
from threading import Thread, current_thread


def production(_task_queue: Queue):
    """
    间隔一秒,模拟一秒生产一个任务
    一直生产任务
    :param: _task_queue
    """
    while True:
        time.sleep(1)
        _task_queue.put(1)
        print(f"生产任务:{_task_queue.qsize()} \t\t\t 线程名称:{current_thread().name}\n")


def consumption(_task_queue: Queue, _count_queue: Queue):
    """
    间隔一秒,模拟一秒消费完一个任务
    只要任务队列中有任务就一直消费
    :param _task_queue:  需要消费的任务数
    :param _count_queue: 已经消费的任务数
    """
    while True:
        if _task_queue.qsize():
            time.sleep(1)
            _task_queue.get()
            _count_queue.put(1)
            print(f"完成任务:{_count_queue.qsize()} \t\t\t 剩余任务:{_task_queue.qsize()} \t\t\t 线程名称:{current_thread().name}\n")
        else:
            # 队列中没任务的时候,间隔一段时间后,再继续
            print(f'所有任务消费完毕,休息一段时间,等待生产 \t\t 线程名称:{current_thread().name}\n')
            time.sleep(10)


if __name__ == '__main__':
    """
    线程间通信 用 queue.Queue 队列
    传参 args 传递的是元组
    只传一个参数时:args = (参数1,)
    """

    # 生产 队列
    tasksQueue = Queue()
    # 已经执行的任务数
    ftQueue = Queue()

    # 3个线程生产任务
    for i in range(1, 4):
        t = Thread(target=production, args=(tasksQueue,), name=f'生产线程{i}')
        t.start()

    # 5个线程消费任务
    for i in range(1, 6):
        t = Thread(target=consumption, args=(tasksQueue, ftQueue), name=f'消费线程{i}')
        t.start()



多进程单线程

import time
from multiprocessing import Process, current_process, Queue


def production(_task_queue: Queue):
    """
    间隔一秒,模拟一秒生产一个任务
    一直生产任务
    :param: _task_queue
    """
    while True:
        time.sleep(1)
        _task_queue.put(1)
        print(f"生产任务:{_task_queue.qsize()} \t\t\t 进程名称:{current_process().name}\n")


def consumption(_task_queue: Queue, _count_queue: Queue):
    """
    间隔一秒,模拟一秒消费完一个任务
    只要任务队列中有任务就一直消费
    :param _task_queue:  需要消费的任务数
    :param _count_queue: 已经消费的任务数
    """
    while True:
        if _task_queue.qsize():
            time.sleep(1)
            _task_queue.get()
            _count_queue.put(1)
            print(
                f"完成任务:{_count_queue.qsize()} \t\t\t 剩余任务:{_task_queue.qsize()} \t\t\t 进程名称:{current_process().name}\n")
        else:
            # 队列中没任务的时候,间隔一段时间后,再继续
            print(f'所有任务消费完毕,休息一段时间,等待生产 \t\t 进程名称:{current_process().name}\n')
            time.sleep(10)


if __name__ == '__main__':
    """
    进程间通信 用 multiprocessing.Queue 队列
    传参 args 传递的是元组
    只传一个参数时:args = (参数1,)
    """

    # 生产 队列
    tasksQueue = Queue()
    # 已经执行的任务数
    ftQueue = Queue()

    # 2个进程生产任务
    for i in range(1, 3):
        p = Process(target=production, args=(tasksQueue,), name=f'生产进程{i}')
        p.start()

    # 3个进程消费任务
    for i in range(1, 4):
        p = Process(target=consumption, args=(tasksQueue, ftQueue), name=f'消费进程{i}')
        p.start()



多进程多线程

import time
from threading import Thread, current_thread
from multiprocessing import Process, current_process, Queue


def production(_task_queue: Queue):
    """
    一个进程中,开多个线程进行生产
    :param _task_queue: 生产任务 队列
    """

    def production_individually():
        """
        间隔一秒,模拟一秒生产一个任务
        一直生产任务
        """
        while True:
            time.sleep(1)
            _task_queue.put(1)
            print(f"生产:{_task_queue.qsize()} \t 进程:{current_process().name} \t 线程:{current_thread().name}\n")

    # 每个进程中,3个线程生产
    for n in range(1, 4):
        t = Thread(target=production_individually, name=f'生产线程{n}')
        t.start()


def consumption(_task_queue: Queue, _count_queue: Queue):
    """
    一个进程中,开多个线程进行消费
    :param _task_queue:  需要消费的任务数
    :param _count_queue: 已经消费的任务数
    """

    def consumption_individually():
        """
        间隔一秒,模拟一秒消费完一个任务
        只要任务队列中有任务就一直消费
        """
        while True:
            if _task_queue.qsize():
                time.sleep(1)
                _task_queue.get()
                _count_queue.put(1)
                print(
                    f"完成:{_count_queue.qsize()} \t 剩余:{_task_queue.qsize()} \t "
                    f"进程:{current_process().name} \t 线程:{current_thread().name}\n"
                )
            else:
                # 队列中没任务的时候,间隔一段时间后,再继续
                print(f'所有任务消费完毕,休息一段时间,等待生产 \t 进程:{current_process().name} \t 线程:{current_thread().name}\n')
                time.sleep(10)

    # 每个进程中,2个线程消费
    for n in range(1, 3):
        t = Thread(target=consumption_individually, name=f'消费线程{n}')
        t.start()


if __name__ == '__main__':
    """
    进程间通信 用 multiprocessing.Queue 队列
    传参 args 传递的是元组
    只传一个参数时:args = (参数1,)
    """

    # 生产 队列
    tasksQueue = Queue()
    # 已经执行的任务数
    ftQueue = Queue()

    # 2个进程生产任务
    for i in range(1, 3):
        p = Process(target=production, args=(tasksQueue,), name=f'生产进程{i}')
        p.start()

    # 3个进程消费任务
    for i in range(1, 4):
        p = Process(target=consumption, args=(tasksQueue, ftQueue), name=f'消费进程{i}')
        p.start()

标签:__,Queue,task,name,Python,queue,--,任务,多线程
From: https://www.cnblogs.com/realizetomoney/p/16730970.html

相关文章

  • 第2章---自动化测试基础
     手工测试(以人为驱动):表示的针对被测系统或者软件实现业务流中的每条路径进行覆盖(每条用例进行手工执行);测试工程师在此过程中就会产生相应的一些弊端; 1.测试人员产......
  • 14. NumPy位运算
    1.前言本节重点讲解NumPy的位运算,NumPy中提供了以下按位运算函数:numpy按位运算函数序号函数位运算符描述说明1bitwise_and&计算数组元素之间的按位与运算。......
  • P5656 【模板】二元一次不定方程 (exgcd)
    P5656【模板】二元一次不定方程(exgcd)\[ax+by=d\\ax_1+by_1=c\\x_1=\frac{x*c}{gcd(a,b)},y_1=\frac{y*c}{gcd(a,b)}\\对于最小正整数解有:x_1+\lambda\frac{b}{gcd......
  • Python菱形继承(网易面试题)
    菱形继承顾名思义,是一个菱形继承(好像是废话),直接上图  菱形继承就是多继承,例上图所有,A是父类,B和C是A的子类,B和C是D的父类。classParent(object):def__init__(......
  • GZOI (市联赛)划水记
    比赛在\(9\)月\(25\)日,从\(9:00\)到\(12:00\),3h四题。一开始用10min看了题,之后就还是选择开T1T1:给两个序列\(\{a_n\},\{b_n\}\\\),每次可以选择两个数\(i,j(i\not=j)\),......
  • 使用 Windows 包管理器 (winget) 安装 .Net
    用户可以在Windows10和Windows11计算机上使用winget命令行工具来发现、安装、升级、删除和配置应用程序。此工具是Windows程序包管理器服务的客户端接口。......
  • SQL分类和DDL操作数据库-创建&查询
    SQL分类 1> DDL(Data Definition Language)数据定义语言 用来定义数据库对象:数据库,表,列等。关键字:create,drop,alter 等 2>DML(Data Manipulation Language)......
  • 实现 Promise.all,所有 Promise 成功返回成功,一个失败返回失败
    首先我们先创建一个resolve和reject的promise函数constpromiseResove=(promiseResolveSecond=function(n=0){returnnewPromise(function(resolve,reject){......
  • 基于el-dialog封装全局弹窗
    dialog<template><div><el-dialogtitle="切换考试"top="9vh":modal="false"width="600px":visible.sync="dialogVisible"@close="close":append-to-body......
  • Python Web Django
    全文:https://www.cnblogs.com/MrFlySand/p/16730898.html1.6创建Django项目进入cmd窗口,输入如下命令,创建Django项目django-adminstartprojectDjango,如下是在code文......