Python3学习笔记-35(多进程)

一、实现方式

import time
import multiprocessing #进程相关包

#使用进程完成多任务

def fun1():
    while True:
        print("…………fun1")
        time.sleep(1)

def fun2():
    while True:
        print("…………fun2")
        time.sleep(1)

def main():
    p1 = multiprocessing.Process(target=fun1) #创建新的线程对象
    p2 = multiprocessing.Process(target=fun2)
    p1.start()  #开启子进程
    p2.start()


if __name__ == "__main__":
    main()

二、使用队列Queue完成多进程之间的通信

import multiprocessing #进程相关包

"""
使用队列(Queue)实现进程间通信
"""



#队列演示(可以实现进程间解耦)
# class MyQueue(object):
#
#     def my_queue(self):
#          q = multiprocessing.Queue(3) #声明队列的长度,不初始化,默认最大(根据机器有所不同)
#          q.put("消息1")
#          q.put(222)
#          q.put([1, 2, 1]) #放入队列中的数据类型可以不同
#          q.put(34543) #放入的数据超过队列长度,会阻塞,等待队列中有新的位置
#          q.put_nowait(213123) #放入的数据超过队列长度,不会阻塞,抛出异常
#          print(q.full()) #判断队列是否已满
#          print(q.get())
#          print(q.get())
#          print(q.full())
#          print(q.get())
#          print(q.empty()) #判断队列是否为空
#          q.get() #如果队列为空,会阻塞,一直等待队里中在此有数据
#          q.get_nowait() #队列为空,不会等待,抛出异常

def fun1(q):
    data = [1, 2, 3, 4, 5]
    for temp in data:
        q.put(temp)
        print("写入数据!")

def fun2(q):
    data = list() #创建一个空列表的另一种方式
    while True:
        if not q.empty():
            data.append(q.get())
        else:
            print(data)
            break

def main():
    # mq = MyQueue()
    # mq.my_queue()

    #创建一个队列
    q = multiprocessing.Queue()
    #创建多个进程,将队列的引用传给函数
    p1 = multiprocessing.Process(target=fun1, args=(q,))
    p2 = multiprocessing.Process(target=fun2, args=(q,))

    p1.start()
    p2.start()

if __name__ == "__main__":
    main()

三、进程池

# -*- coding:utf-8 -*-
from multiprocessing import Pool
import os, time, random

"""
进程池
"""

def worker(msg):
    t_start = time.time()
    print("%s开始执行,进程号为%d" % (msg, os.getpid()))
    # random.random()随机生成0~1之间的浮点数
    time.sleep(random.random() * 2)
    t_stop = time.time()
    print(msg, "执行完毕,耗时%0.2f" % (t_stop - t_start))


def main():
    po = Pool(3)  # 定义一个进程池,最大进程数3
    for i in range(0, 10):
        # Pool().apply_async(要调用的目标,(传递给目标的参数元祖,))
        # 每次循环将会用空闲出来的子进程去调用目标
        po.apply_async(worker, (i,))

    print("----start----")
    po.close()  # 关闭进程池,关闭后po不再接收新的请求
    po.join()  # 等待po中所有子进程执行完成,必须放在close语句之后
    print("-----end-----")

if __name__ == '__main__':
    main()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值