首页 > 其他分享 >3月29日课后总结

3月29日课后总结

时间:2023-03-29 20:57:14浏览次数:37  
标签:总结 __ target Process args 29 start 课后 print

3/29课后总结

Process类中得方法

from multiprocessing import Process
import time

def test():
    print(11)
    time.sleep(5)

if __name__ == '__main__':
    p = Process(target=test)
    p.start()  # 进程开始
    # p.join()  # 在子线程运行完毕后在运行主线程
    p.terminate()  # 杀死进程(需要一段时间,不会立马杀死)
    time.sleep(0.1)
    print(p.is_alive())  # 查看进程是否存活

如何查看进程号pid

from multiprocessing import Process
import os

def test():
    print(11)
    print('子进程内的子进程pid:',os.getpid())
    print('子进程内查看主进程的pid:',os.getppid())


if __name__ == '__main__':
    p = Process(target=test)
    p.start()
    print('在主进程查看子进程的pid:',p.pid)  # 放在start前面的话会显示None
    print('在主进程查看主进程的pid:',os.getpid())

如何开启多进程

# 每个进程都会有一个进程号
from multiprocessing import Process
import time

def test(i):
    print(i)
    time.sleep(1)

if __name__ == '__main__':
    begin_time = time.time()
    l = []
    for i in range(10):
        """通知开进程,但是不一定能立马开起来,开进程需要消耗资源"""
        p = Process(target=test,args=(i,))
        p.start()
        # p.join()  如果是这里加join那么就会变成串行执行
        l.append(p)
        
    for j in l:
        j.join()
    print('end')
    print(time.time()-begin_time)

基于TCP的高并发程序

from multiprocessing import Process,Lock
import socket

def run(conn,client_addr):
    while True:
        try:
            data = conn.recv(1024)
            data = data.decode('utf-8')
            print(f'接受到了来自{client_addr[0]}端口{client_addr[1]}传的{data}')
            if data == '结束':
                conn.send('断开此次连接'.encode('utf-8'))
                break
            conn.send('接受到了'.encode('utf-8'))
        except Exception as e:
            print(e)
            break
    conn.close()

if __name__ == '__main__':
    server = socket.socket()
    server.bind(('192.168.1.171', 9000))
    server.listen(5)
    while True:
        conn, client_addr = server.accept()  # 程序开起来后等待接收,阻塞,不加这句可能死循环,直接让电脑死机
        p = Process(target=run,args=(conn,client_addr))
        p.start()

进程锁

'''进程锁是我们目前学习的第一把锁,锁在IT界非常重要,用的也非常多,MySQL中用锁的地方很多'''
比如:行锁,表锁,乐观锁,悲观锁...
# 所有锁的目的都是为了安全

from multiprocessing import Process,Lock
import time

def test(i,lock):
    # 进入进程先上锁
    lock.acquire()
    print(f'进程{i}开启')
    time.sleep(1)
    print(f'进程{i}关闭')
    lock.release()  # 运行完毕释放锁



if __name__ == '__main__':
    lock = Lock()  # 拿到一把锁,只需要一把锁就行
    for i in range(5):
        # 一次开启多个进程的时候,哪个进程先开启或者结束不知道,需要操作系统来决定
        p = Process(target=test,args=(i,lock))
        p.start()

进程之间数据隔离问题

# 守护进程
'''进程之间的数据是相互隔离的,不能互相使用'''

from multiprocessing import Process
import time

x = 100

def test():
    global x
    x = 500



if __name__ == '__main__':
    p = Process(target=test)
    p.start()
    p.join()
    print(x)

队列Queue

'''数据结构:队列,链表,单链表,双链表,循环链表,栈,树:二叉树,平衡树,红黑树,b树,b+树,b-树,图'''
# 队列是先进先出的
1. 创建队列
2. 入队列
3. 出队列
from multiprocessing import Queue

if __name__ == '__main__':
    q = Queue(3)  # 创建一个长度为3的队列
    q.put(1)  # 入队列
    q.put(2)
    q.put(3)
    # q.put(3, block=False)  # 当block为False时如果队列满了直接报错,默认为Ture满了会等待出队列
    # q.put(3, timeout=2)  # timeout=一个数字,如果队列满了会等待出队列直到超时输入的数字为止就报错
    # q.put(3)  # 队列满了会一直等待下去
    res = q.get()  # 出队列
    res1 = q.get()
    res2 = q.get()
    # res3 = q.get(block=False)  # 当block为False时如果队列空了直接报错,默认为True也就是空了会等待入队列
    # res3 = q.get(timeout=2)  # timeout=一个数字,如果队列空了会等待入队列直到超时输入的数字为止就报错
    print(res,res1,res2,res3)
    # print(q.qsize())  # 查看队列中的成员
    # print(q.full())  # 判断队列是否为空

解决进程之间的数据隔离

# 进程之间的通信(IPC)
from multiprocessing import Process,Queue

def test(q):
    q.put(1)  # 在子进程中入队列

if __name__ == '__main__':
    q = Queue(5)  # 创建队列
    p = Process(target=test,args=(q,))
    p.start()  #在子进程中写入数据,去主进程中读取子进程中写的数据,如果能读到,说明通信了,如果读不到就不能通信
    p.join()
    print(q.get())
    
'''
	此时,	Queue队列中得数据是在内存中存着的
	在实际工作中,队列我们会使用专业的消息队列:RabbitMq,Kafka,Rocket Mq...
	Redis数据库(缓存)------>作为队列使用
'''

生产者消费者模型

生产者和消费者模式解决大多数的并发问题,
# 版本1:
# # 1. 生产者
# def producer(q):
#     # 生产10个包子
#     for i in range(10):
#         q.put('生产了第%s个包子' % i)
#
#
# # 2. 消费者
# def consumer(q):
#     while True:
#         print(q.get())
#
#
# from multiprocessing import Process, Queue
#
# if __name__ == '__main__':
#     q = Queue(20)
#     p = Process(target=producer, args=(q,))
#     p.start()
#
#     p1 = Process(target=consumer, args=(q,))
#     p1.start()


# 版本2:
# 1. 生产者
# def producer(q):
#     # 生产10个包子
#     for i in range(10):
#         q.put('生产了第%s个包子' % i)
#     q.put(None)  # 其实就是个标志位
#
#
# # 2. 消费者
# def consumer(q):
#     while True:
#         res = q.get()
#         print(res)
#         if res is None:
#             break
#
#
# from multiprocessing import Process, Queue
#
# if __name__ == '__main__':
#     q = Queue(20)
#     p = Process(target=producer, args=(q,))
#     p.start()
#
#     p1 = Process(target=consumer, args=(q,))
#     p1.start()

# 版本3:
# def producer(q):
#     # 生产10个包子
#     for i in range(10):
#         q.put('生产了第%s个包子' % i)
#
#
# # 2. 消费者
# def consumer(q):
#     while True:
#         res = q.get()
#         print(res)
#         if res is None:
#             break
#
#
# from multiprocessing import Process, Queue
#
# if __name__ == '__main__':
#     q = Queue(20)
#     p = Process(target=producer, args=(q,))
#     p.start()
#
#     p1 = Process(target=consumer, args=(q,))
#     p1.start()
#     p.join()
#     q.put(None)  # 其实就是个标志位


# 版本4:多生产者,少消费者
def producer(q, food, name):
    # 生产10个包子
    for i in range(10):
        q.put('%s生产了%s' % (name, food))


# 2. 消费者
def consumer(q):
    while True:
        res = q.get()
        print(res)
        if res is None:
            break


from multiprocessing import Process, Queue

if __name__ == '__main__':
    q = Queue(100)
    p1 = Process(target=producer, args=(q, '馒头', 'ly'))
    p2 = Process(target=producer, args=(q, '咖啡', 'kevin'))
    p3 = Process(target=producer, args=(q, '烧麦', 'tony'))
    p4 = Process(target=producer, args=(q, '奶茶', 'tank'))
    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()
    q.put(None)  # 其实就是个标志位
    q.put(None)  # 其实就是个标志位
    
# 布置个作业:少生产者,多消费者的情况


def producer(q, food, name):
    # 生产10个包子
    for i in range(10):
        q.put('%s生产了%s' % (name, food))


# 2. 消费者
def consumer(q):
    while True:
        res = q.get()
        print(res)
        if res is None:
            break


from multiprocessing import Process, Queue

if __name__ == '__main__':
    q = Queue(100)
    p1 = Process(target=producer, args=(q, '馒头', 'ly'))
    p2 = Process(target=producer, args=(q, '咖啡', 'kevin'))
    # p3 = Process(target=producer, args=(q, '烧麦', 'tony'))
    # p4 = Process(target=producer, args=(q, '奶茶', 'tank'))
    p1.start()
    p2.start()
    # p3.start()
    # p4.start()

    p5 = Process(target=consumer, args=(q,))
    p6 = Process(target=consumer, args=(q,))
    p7 = Process(target=consumer, args=(q,))
    p8 = Process(target=consumer, args=(q,))
    p5.start()
    p6.start()
    p7.start()
    p8.start()

    p1.join()
    p2.join()
    # p3.join()
    # p4.join()
    q.put(None)  # 其实就是个标志位
    q.put(None)  # 其实就是个标志位
    q.put(None)  # 其实就是个标志位
    q.put(None)  # 其实就是个标志位

标签:总结,__,target,Process,args,29,start,课后,print
From: https://www.cnblogs.com/juzixiong/p/17270274.html

相关文章

  • 【2023-03-29】家和旺事
    20:00过了几十年我才发现,我可以用一个不一样的问题来面对我的人生。不是:我为何活着?而是:我要用我被赋予的生命做些什么?                ......
  • Beyond Compare免费保姆级激活教程(亲测日期:2023.3.29)
    最新,亲测可用(亲测日期:2023.3.29)如果成功使用后,记得回来点个赞哦!BeyondCompare具备的丰富实用功能:1.并列比较文件夹、FTP网站或Zip文件;2.为以后的比较保存快照;3.类似浏......
  • log-2023-03-29
    TODO:ForwardingTree调试:1)prim计算树,2)static反序列化,诊断,3)根据refTree生成?ConfigTaint:1)找到static部分,2)找到policy部分,3)找到peer部分PAPERS:NetKAT???【PL的文......
  • MySQL查看修改存储引擎总结
    本文总结了MySQL下查看、修改存储引擎的一些方法。测试、验证环境为MySQL5.6,如有差异,请以实际版本为准。1:查看MySQL的存储引擎信息 1.1使用showengines命令。 ......
  • 正确做事的“法门”,一篇资深专家对 SRE 稳定性总结
    前言在技术工作中,对于产品/基础技术研发和SRE两种角色,通常会有基于「是否侧重编码」的理解。对于产品研发转做SRE,经常会产生是否要「脱离编码工作」的看法,或者认为是否......
  • 每日总结-23.3.29-利于云服务器和javaweb简单实现一个网站
    3月29日总结今日使用云服务器和tomcat实现了简单网站的搭建。使用工具(个人体验,仅作参考,使用其他版本或工具应该也行):1.移动云新人体验免费云服务器一台。(个人专享:通......
  • 操作系统01.3.29
    操作系统概述操作系统的基本概念操作系统(OperationSystem),简称OS,是管理硬件和软件资源的计算机程序。操作系统有很多,比如Windows、Linux、macOS、Unix、andriod、i......
  • MISC总结
    1.编码解码工具http://www.mxcz.net/tools/Hex.aspx字符集UTF-8、UTF-7、GB2312、GBK等16进制码以\x开头ASCII0-9:45-57A-Z:65-90a-z:97-122URL编码(百分号......
  • 2012第29周官方应用市场Top Grossing动态
    本周官方市场的动态:最近几周在收入榜单排名上,三个官方市场的新进榜应用在数量基本相当,没有太大的出入,而且在收入榜单榜首的也一直都是几款收费游戏(由于GooglePlay在中国区......
  • abc295-G
    题目链接:https://atcoder.jp/contests/abc295/tasks/abc295_g题目意思:给你一颗以1为根的有向树,询问有两种情况:    第一种询问是在u,v中加一条边,保证v是可以到u的。......