学习Python的第六天

python每日总结 专栏收录该内容
5 篇文章 0 订阅

与Python相处的第六天
前言:每个人的女朋友都会跟你闹一些别扭 今天Python对我就不是特别友好 然而我给它听了一首歌 就这样 我们就又和好了 我把链接分享给大家一下。
勇士我饮酒醉
喜欢的朋友可以下载一下。
进入正题
不知道写什么标题
进程通信:
当然大家知道 管道有两个口(当然硬解释把另一个口堵死我无话可说),水在管道里面流通的时候就是遵循着先进先出的规律。
格式:
首先 管道是一个函数 需要有个输出的 也要有一个接受的 这样才是管道

def func(conn):  # conn表示管道类型
    print('func',os.getpid(), conn.recv())  # 收到的数据
    conn.send(['a', 'b', 'c', 'd', 'e'])  # 发送的数据
    conn.close()  # 关闭

那么 这个接收的创建好了 那么怎么发送这个东西呢 很简单 编写一个程序 发送到管道里面就可以进行输出了啊~

if __name__ == "__main__":
    conn_a, conn_b = multiprocessing.Pipe()  
    # 创建一个管道,有两个口
# 相当于在进程中conn_a.send(['a','b','c','d','e']),发送给conn_b
p = multiprocessing.Process(target=func, args=(conn_a,)).start()
conn_b.send([1, 2, 3, 4, 5, 6, 7])  # 发送数据给conn_a
print('mian',os.getpid(), conn_b.recv())

这样一个完整的管道就创建好了。
完整代码如下:

import multiprocessing
def func(conn):  # conn表示管道类型
    print('func',os.getpid(), conn.recv())  # 收到的数据
    conn.send(['a', 'b', 'c', 'd', 'e'])  # 发送的数据
    conn.close()  # 关闭
    
if __name__ == "__main__":
    conn_a, conn_b = multiprocessing.Pipe()  
    # 创建一个管道,有两个口
        p = multiprocessing.Process(target=func, args=(conn_a,)).start()
    	conn_b.send([1, 2, 3, 4, 5, 6, 7]) 
     # 发送数据给conn_a
    print('mian',os.getpid(), conn_b.recv())

这是今天学的最重要的管道 conn 下面就有一个练习题
练习:
创建一个简单的机器人 如果你对机器人说‘你好’ 它便回复你‘我不好’ 如果是其他的 会恢复你 滚远点儿好吗。

def N(conn):
    while 1:
        recv_ = conn.recv()
        #print('机器人收到:%s'%recv_)
        if recv_ == '你好':
            conn.send('我不好')
        else:
            conn.send('滚远点好吗')

def P(conn):
    y = 'y'
    while y != 'n' :
        input_ = input('人说:')
        conn.send(input_)
        print(conn.recv())


if __name__ == "__main__":
    conn_N,conn_P = multiprocessing.Pipe()
    p_N = multiprocessing.Process(target = N,args=(conn_N,))
    p_N.start()
    P(conn_P)

不知道写什么标题而写标题
很重要的 Python Queue 队列 以下内容全部来自Python的官方文本 也有自己的想法 需要看官方文件的请参考

Queue队列
class asyncio.Queue(maxsize=0, *, loop=None)
先进,先出(FIFO)队列
如果 maxsize 小于等于零,则队列尺寸是无限的。如果是大于 0 的整数,则当队列达到 maxsize 时, await put() 将阻塞至某个元素被 get() 取出
1.maxsize
队列中可存放的元素数量
2.empty()
如果队列为空返回 True ,否则返回 False
3.full()
如果有 maxsize 个条目在队列中,则返回 True 。
如果队列用 maxsize=0 (默认)初始化,则 full() 永远不会返回 True 。
4.coroutine get()
从队列中删除并返回一个元素。如果队列为空,则等待,直到队列中有元素。
5.get_nowait()
立即返回一个队列中的元素,如果队列内有值,否则引发异常 QueueEmpty
6.coroutine join()
阻塞至队列中所有的元素都被接收和处理完毕。
当条目添加到队列的时候,未完成任务的计数就会增加。每当消费协程调用 task_done() 表示这个条目已经被回收,该条目所有工作已经完成,未完成计数就会减少。当未完成计数降到零的时候, join() 阻塞被解除。
7.coroutine put(item)
添加一个元素进队列。如果队列满了,在添加元素之前,会一直等待空闲插槽可用。
8.coroutine put(item)
添加一个元素进队列。如果队列满了,在添加元素之前,会一直等待空闲插槽可用。
9.put_nowait(item)
不阻塞的放一个元素入队列。
如果没有立即可用的空闲槽,引发 QueueFull 异常。
10.qsize()
返回队列用的元素数量。
11.task_done()
表明前面排队的任务已经完成,即get出来的元素相关操作已经完成。
12.后进先出队列
class asyncio.LifoQueue
Queue 的变体,先取出最近添加的条目(后进,先出)。
13.示例(本示例也来源于官方文本)

import asyncio
import random
import time


async def worker(name, queue):
    while True:
        # Get a "work item" out of the queue.
        sleep_for = await queue.get()

        # Sleep for the "sleep_for" seconds.
        await asyncio.sleep(sleep_for)

        # Notify the queue that the "work item" has been processed.
        queue.task_done()

        print(f'{name} has slept for {sleep_for:.2f} seconds')


async def main():
    # Create a queue that we will use to store our "workload".
    queue = asyncio.Queue()

    # Generate random timings and put them into the queue.
    total_sleep_time = 0
    for _ in range(20):
        sleep_for = random.uniform(0.05, 1.0)
        total_sleep_time += sleep_for
        queue.put_nowait(sleep_for)

    # Create three worker tasks to process the queue concurrently.
    tasks = []
    for i in range(3):
        task = asyncio.create_task(worker(f'worker-{i}', queue))
        tasks.append(task)

    # Wait until the queue is fully processed.
    started_at = time.monotonic()
    await queue.join()
    total_slept_for = time.monotonic() - started_at

    # Cancel our worker tasks.
    for task in tasks:
        task.cancel()
    # Wait until all worker tasks are cancelled.
    await asyncio.gather(*tasks, return_exceptions=True)

    print('====')
    print(f'3 workers slept in parallel for {total_slept_for:.2f} seconds')
    print(f'total expected sleep time: {total_sleep_time:.2f} seconds')


asyncio.run(main())

简单的示范

import multiprocessing
import os

queue = multiprocessing.Queue()


def adddata(queue, i):  # 子进程调用的函数
    queue.put(i)
    print('put', os.getppid(), os.getpid(), i)


if __name__ == '__main__':  # 脚本父进程
    mylist = []
    for i in range(10):
        p = multiprocessing.Process(target=adddata, args=(queue, i))  # 子进程
        p.start()
        # print(queue.get())
        mylist.append(queue.get())  # get拿不到东西会一直等待(好男人啊!)

进程数据共享

import multiprocessing


def func(num):
    num.value = 10


if __name__ == '__main__':
    # multiprocessing.Value可以在不同进程之间共享数据
    num = multiprocessing.Value('d', 1)  # double float
    print(num.value)  # 单单num返回的结果 Synchronized wrapper for c_double(1.0)
    p = multiprocessing.Process(target=func, args=(num,))
    p.start()
    p.join()
    print(num.value)

进程列表数组共享

import multiprocessing


def func(num):
    num[2] = 9999


if __name__ == '__main__':
    # 不同进程之间实现数组共享
    num = multiprocessing.Array('i', [1, 2, 3, 4, 5, 6])  # i代表int类型
    print(num[:])
    p = multiprocessing.Process(target=func, args=(num,))
    p.start()
    p.join()
    print(num[:])

进程字典列表共享

import multiprocessing


def func(mydict, mylist):
    mydict["胡旺"] = "牛皮"
    mydict["lalal"] = "大美女"
    mylist.append(11)
    mylist.append(22)
    mylist.append(33)


if __name__ == "__main__":
    # with multiprocessing.Manager() as MG:
    #     mydict=MG.dict()
    #     mylist=MG.list(range(5))
    mydict = multiprocessing.Manager().dict()
                                        # [0,1,2,3,4]
    mylist = multiprocessing.Manager().list(range(5))

    p = multiprocessing.Process(target=func, args=(mydict, mylist))
    p.start()
    p.join()

    print(mylist)
    print(mydict)
# print(list(range(5)))  # 很牛逼的list

总结:咋说呢 今天学的会不会 自己也不知道 作业也不知道会不会写 今天会公布day06的作业与答案 请大家观看下一篇博客。
那么 又到了期待已久的情侣头像分享环节了,请喜欢的同学自行保存下载。
在这里插入图片描述
在这里插入图片描述
如果有喜欢的同学 请点赞收藏加转发 最好给投个硬币 晚上有没有鸡腿吃就看各位的了~~~

  • 3
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值