• 基于udp协议支持并发的套接字/并发相关的概念/开启进程的两种方式/进程对象的方法


    一:基于udp协议支持并发的套接字

    客户端:
    
    
    from socket import *
    
    client = socket(AF_INET,SOCK_DGRAM)
    
    while True:
        msg = input(">>>: ").strip()
        client.sendto(msg.encode('utf-8'),('127.0.0.1',9999))
        res,server_addr = client.recvfrom(1024)
        print(res.decode('utf-8'))
    服务端:
    
    
    import socketserver
    
    class MyRequestHanlder(socketserver.BaseRequestHandler):
        def handle(self):
            data,server = self.request
            server.sendto(data.upper(),self.client_address)
    
    
    server = socketserver.ThreadingUDPServer(('127.0.0.1',9999),MyRequestHanlder)
    server.serve_forever()

    二:并发相关的概念

    进程:正在运行的一个程序,是一个动态的概念,可以说是操作系统的干活过程(也就是操作系统控制硬件来运行程序的过程)

    程序:就是一系列的代码文件,是一个静态的概念

    多道技术:

                    (1)空间上的复用

                    (2)时间上的复用:CPU一天的使用时间分布在各个程序上,CPU在多个任务之间的快速切换:遇到io切,占用时间过长

    并发:一台CPU上的来回切换

    并行:真正意义上的并发

    串行:一个运行完运行完下一个

    一个任务的运行的三种状态:

    1. 进程挂起是自身原因,遇到I/O阻塞,便要让出CPU让其他进程去执行,这样保证CPU一直在工作

    2. 与进程无关,是操作系统层面,可能会因为一个进程占用时间过多,或者优先级等原因,而调用其他的进程去使用CPU。

      因而一个进程由三种状态

     提交任务的两种方式:

    同步:提交完一个任务等待结果,再做另外一个任务;例如:叫一个外卖,等着她送达

    异步:提交一个任务,不需要等待完成,就可以做下一个任务;例如:叫一个外卖,然后接下来我就做其他的事情

    三:开启进程的两种方式

    方法1:

    from multiprocessing import Process #开启进程的命令
    import os,time
    
    def task(n):
        print('父进程:%s 自己:%s 正在运行' %(os.getppid(),os.getpid()))
        time.sleep(3)
        print('父进程:%s 自己:%s 运行完毕' %(os.getppid(),os.getpid()))
    
    if __name__=='__main__':        #起进程的代码规定
      p=Process(target=task,args=(3,)) 
      p.start()
    #通知操作系统开启进程
      print('',os.getpid())

    结果:

    主 16072
    父进程 16072 自己的12424 正在运行
    父进程 16072 自己的12424 运行结束

    方法2:

    from multiprocessing import Process
    import os,time
    
    class Myprocess(Process):
        def __init__(self,n):
            super().__init__()
            self.n=n
    
        def run(self) -> None:
            print('父进程 %s 自己的%s 正在运行' %(os.getppid(),os.getpid()))
            time.sleep(2)
            print('父进程 %s 自己的%s 运行结束' %(os.getppid(),os.getpid()))
    
    if __name__=='__main__':
        p=Myprocess(3)
        p.start()
        print('',os.getpid())

    四:进程内存空间之间彼此隔离

    import time,os
    from multiprocessing import Process
    
    count=100
    
    def task():
        global count
        count=0
    if __name__=='__main__':
        p=Process(target=task)
        p.start()
        time.sleep(3)
        print('',count)
    
    结果是:主 100

    五:进程对象的方法

    1.  .join的作用是等待进程结束结束的最佳等待时间,下方的例子就是p.join()是等子进程刚运行结束就运行主进程  去替代上个例子中的 time.sleep(5)

    import os,time
    from multiprocessing import Process
    
    count=100
    def task():
        global count
        count=0
    
    if __name__=='__main__':
        p=Process(target=task)
        p.start()
        p.join()
        print('',count)

    2.join的另一个例子

    from multiprocessing import  Process
    import os,time
    
    def task(n):
        print(os.getppid())
        time.sleep(n)
    
    if __name__=='__main__':
        p1=Process(target=task,args=(3,))
        p2=Process(target=task,args=(2,))
        p3=Process(target=task,args=(1,))
    
        start=time.time()
        p1.start()
        p2.start()
        p3.start()
    
        p3.join()
        p2.join()
        p1.join()
    
        stop=time.time()
        print(stop-start)
    结果是:
    
    6924
    6924
    6924
    3.1128039360046387

    3.join的其他用法from multiprocessing import Process

    import os,time
    
    def task(n):
        print(os.getppid())
        time.sleep(n)
    
    if __name__=='__main__':
        p1=Process(target=task,args=(3,)) 可以在造进程对象的时候给进程命名:p1=Process(target=task,args=(3,),name=‘hjklgh’)
    p2=Process(target=task,args=(2,)) p3=Process(target=task,args=(1,)) start=time.time() p1.start() p2.start() p3.start() p1.join() p2.join() p3.join() stop=time.time() print(stop-start) 
      p1.name #看一个进程的名字
      p1.pid #看进程的ID
    p1.is_alive #判断进程是否存活的
    p1.terminate()#结束p1这个进程
     
  • 相关阅读:
    Struts2的常见的配置文件介绍
    第一个Struts2实例之hello world!
    Highcharts实现图形报表(我主要实现javaweb开发的图形报表)
    基于jsp+servlet图书管理系统之后台用户信息删除操作
    基于jsp+servlet图书管理系统之后台用户信息修改操作
    基于jsp+servlet图书管理系统之后台用户信息查询操作
    基于jsp+servlet图书管理系统之后台用户信息插入操作
    初识Jsp,JavaBean,Servlet以及一个简单mvc模式的登录界面
    Java中IO流,输入输出流概述与总结
    【转】Android 创建AVD各参数详解
  • 原文地址:https://www.cnblogs.com/dayday-up-a/p/14297174.html
Copyright © 2020-2023  润新知