线程、进程、协程 (2)

孤儿进程:父进程先结束,子进程还没结束
僵尸进程:如果一个子进程死了,父进程没有收尸,在收尸前的整个期间,子进程就称为僵尸进程。

线程之间共享全局变量。

原子操作(原子性):要么不做,要做就做完。

线程安全问题:可能在一句代码还没执行完,操作系统就停止了代码的运行。

轮询:是一种CPU决策如何提供周边设备服务的方式,又称程控输出入

多任务UDP聊天器:

import socket import threading # 定义发送数据的函数 def send_data(udp_socket): # 定义要发送的内容 send_content = input("请输入要发送的内容:") # 请输入IP地址 ipddr = input("请输入IP地址,格式为:xxx.xxx.xxx.xxx :") # 请输入端口号 port = int(input("请输入端口号:")) # 把要发送的数据转换为 二进制 send_data = send_content.encode("utf-8") # 发送数据 udp_socket.sendto(send_data, (ipddr, port)) # 测试 # 定义接收数据的函数 def recvData(udp_socket): while True: # 接收数据 recv_data = udp_socket.recvfrom(1024) # 如果数据存在,则解析数据 if recv_data: # 拆包,得到内容 msg, list_port = recv_data # 拆包,得到msg msg = msg.decode("gbk") # 打印内容 print(msg, list_port) else: # 数据不存在停止循环 break # 定义主入口函数 def main(): # 定义套接字 udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 绑定服务器客户端端口 # udp_socket.bind(("", 7878)) # 定义子线程并且开启 t1 = threading.Thread(target=recvData, args=(udp_socket, )) # 设置守护线程 t1.setDaemon(True) t1.start() while True: print("-------------------") print("-- 1、发送数据 --") print("-- 2、退出系统 --") print("-------------------") num = int(input("请选择功能【1/2/3】:")) if num < 1 or num > 3: print("输入不合法!,请重新输入") else: if num == 1: # 发送数据 send_data(udp_socket) if num == 2: print("正在退出系统...") print("系统已退出") break if __name__ == '__main__': main()

===========================================================================

进程:操作系统中的算法包括:时间片轮转、优先级调度、


并发:看上去一起执行。当前的任务数量大于核数。
并行:真正的一起执行。当前任务数小于核数。

调度算法:什么样的情况下按照什么样的规则让谁去执行。
编写完毕的代码,在没有运行的时候称之为程序,在运行的时候称之为进程。

1、fork()创造子线程
import os
fork():可以在python程序中创建子进程。
ret = os.fork()
在fork()中,主进程想要结束,不会因为子进程没有结束而等待。只要子进程产生,子进程的执行顺序和执行过程和主进程一样,就是众所周知的代码执行的过程。


2.pid值:
getpid():获取当前进程的pid值。
pid值:在操作系统当中,当进程运行起来时,操作系统都会给这个进程分配一个独一无二的值,即pid值。processID
父进程中fork的返回值,就是刚刚创建出来的子进程的id。
getppid():获取父进程的pid值。
pid值小于等于65535


3.Process()创造子线程:

import multiprocessing import time # 定义函数 def work1(): for i in range(10): print("work1----", i) time.sleep(0.5) if __name__ == '__main__': # 创建进程 # 1. 导入 multiprocessing 模块 # 2. multiprocessing.Process() 创建子进程 # 3. start() 方法启动进程 p1 = multiprocessing.Process(group=None, target=work1) p1.start() for i in range(10): print("这是主进程", i) time.sleep(0.5)

 

 

    p.join()#加了join之后,主进程会等子进程执行完代码之后,再开始执行join下面的代码

    join([timeout])#堵塞:主进程等待子进程结束之后才结束。timeout表示操作时间。
    terminate():不管任务是否完成,立即终止。

    由于process的跨平台更好,以后不用fork,而是用process

 

 

Process语法结构如下:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpfygs.html