pythonNet day04

不管现实多么惨不忍睹,都要持之以恒地相信,这只是黎明前短暂的黑暗而已。不要惶恐眼前的难关迈不过去,不要担心此刻的付出没有回报,别再花时间等待天降好运。真诚做人,努力做事!你想要的,岁月都会给你。pythonNet day04,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

本地套接字

作用:用于本地不同程序间的进行数据传输

本地套接字的创建流程

1、创建套接字对象

  sockfd = socket(AF_UNIX,SOCK_STREAM)

2、绑定本地套接字文件,如果文件不存在,则自动创建文件(绑定套接字文件)

  sockfd.bind(file)

  判断一个文件夹下是否有某个文件  os.path.exists(‘./tcp_client.py’)

  删除一个文件  os.remove(file)  os.remove(file)

3、监听  listen

4、接收发送消息  recv  send

pythonNet day04
pythonNet day04

 1 from socket import * 
 2 import os 
 3 
 4 sock_file =  './sock'    # 使用哪个文件作为套接字文件
 5 
 6 if os.path.exists(sock_file):# 判断文件是否已经存在
 7     os.unlink(sock_file)
 8 
 9 sockfd = socket(AF_UNIX,SOCK_STREAM)    # 创建本地套接字
10 
11 sockfd.bind(sock_file)    # 绑定
12 sockfd.listen(5)    # 监听
13 
14 while True:
15     c,addr = sockfd.accept()     # 建立连接
16     while True:
17         data = c.recv(1024)
18         if not data:
19             break
20         print(data.decode())
21     c.close()
22 sockfd.close()

服务端

pythonNet day04
pythonNet day04

 1 from socket import * 
 2 
 3 sock_file = "./sock"    # 确保通信两端用相同的套接字文件
 4 
 5 sockfd = socket(AF_UNIX,SOCK_STREAM)    # 创建套接字
 6 
 7 sockfd.connect(sock_file)    # 链接
 8 
 9 while True:
10     msg = input("Msg>>")
11     if msg:
12         sockfd.send(msg.encode())
13     else:
14         break 
15 
16 sockfd.close()

客户端

多任务编程

意义:充分利用计算机的资源提高程序的运行效率

定义:通过应用程序利用计算机多个核心,达到同时执行多个任务的目的

实施方案: 多进程、多线程

并行:多个计算机核心在同时处理多个任务,多个任务之间是并行关系

并发:计算机同时处理多个任务,内核在多个任务间不断切换,达到好像在同时处理的运行效果。此时多个任务实际为并发关系

进程:程序在计算机中运行一次的过程

程序:是一个可执行文件,是静态的,占有磁盘,不占有计算机运行资源

进程:进程是一个动态的过程描述,占有CPU内存等计算机资源的,有一定的生命周期

* 同一个程序的不同执行过程是不同的进程,因为分配的计算机资源等均不同

进程的创建过程

1、用户启动一个程序或者进程创建,发起进程创建

2、操作系统接收用户请求,分配计算机资源,创建进程

3、操作系统分配进程资源给用户使用,分配资源

4、用户利用操作系统提供的进程完成任务  利用资源完成任务

CPU时间片:如果一个进程占有计算机核心,我们称为该进程在CPU时间片上。多个任务实际对CPU会进行争夺,一般由操作系统分配CPU时间片

PCB进程控制块:在操作系统中,进程创建后会自动产生一个空间存放进程消息,称为进程控制块

进程信息包括:进程PID,进程占有的内存位置,创建时间,创建用户。。。。。。

进程PID:进程在操作系统中的唯一编号,大于0整数,由系统自动分配

进程信息查看命令:  ps -aux

进程特征:

  1、进程是操作系统分配计算机资源的最小单位

  2、每一个进程都有自己单独的虚拟内存空间

  3、进程间的执行相互独立,互不影响

进程的状态

1、三态

  1、就绪态:进程具备执行条件,等待系统分配CPU

  2、运行态:进程占有CPU处理器,处于运行状态

  3、等待态:进程暂时不具备运行条件,需要阻塞等待,让出CPU

2、五态(增加新建态和终止态)

  4、新建态:创建一个新的进程,获取资源的过程

  5、终止态:进程结束释放资源的过程

  pa -sux  —> 查看进程状态

  D 等待态 (不可中断等待)(阻塞
  S 等待态 (可中断等待)(睡眠
  T 等待态 (暂停状态)
  R 运行态 (就绪态运行态)
  Z 僵尸态

  + 前台进程(能在终端显示出现象的)
  < 高优先级
  N 低优先级
  l 有进程链接
  s 会话组组长

进程优先级

  优先级决定一个进程的执行权限占有资源的优先程度

  查看进程优先级

    top:动态的查看进程优先级  < > 翻页

    取值范围:-20 —– 19   -20优先级最高

  nice:指定优先级运行程序

  nice -9 ./while.py  (以9的优先级运行程序)

  sudo nice –9 ./while.py  (以-9的优先级运行程序)(0以下的优先级需要加sudo)

父子进程

在系统中除了初始化进程每个进程都有一个父进程,可能有0个或者多个子进程。由此形成父子进程关系。我们认为每个进程都是父进程发起请求创建的。

进程(process)

查看进程数:pstree

查看父进程PID:ps -ajx

import os

pid = os.fork() 创建一个新的进程

返回值:失败返回一个负数

    成功在原有的进程中返回子进程的PID,然后在新的进程中返回0

1、子进程会复制父进程全部代码段,包括fork前的代码

2、子进程从fork的下一句开始执行

3、父进程中fork返回值即为子进程的PID号

4、父进程不一定先执行

3、父子进程通常会根据fork返回值的差异选择执行不同的代码(使用if结构)

4、父子进程在执行上互不干扰,执行顺序不确定

5、父子进程空间独立,各自修改各自的内容,互不影响

6、子进程虽然复制父进程内容,但是也由自己的特有属性特征,比如:PID号PCB内存空间

pythonNet day04
pythonNet day04

 1 import  os 
 2 from time import sleep
 3 
 4 pid = os.fork()
 5 
 6 if pid < 0:
 7     print("创建进程失败")
 8 
 9 #子进程执行部分
10 elif pid == 0:
11     print("新进程创建成功")
12 
13 #父进程执行部分
14 else:
15     sleep(1)
16     print("原来的进程")
17 
18 print("程序执行完毕")
19 
20 # 新进程创建成功
21 # 原来的进程
22 # 程序执行完毕

View Code

pythonNet day04
pythonNet day04

 1 import os 
 2 from time import sleep 
 3 
 4 a = 1
 5 pid = os.fork()
 6 if pid < 0:
 7     print("创建进程失败")
 8 elif pid == 0:
 9     print("子进程")
10     print("a = ",a)
11     a = 10000
12     print("a = ",a)
13 else:
14     sleep(1)
15     print("父进程")
16     print("parent a :",a)    # a = 1
17 
18 # 子进程
19 # a =  1
20 # a =  10000
21 # 父进程
22 # parent a : 1

子进程和父进程的变量域

由上可知,创建一个子进程,子进程在复制完父进程的代码后,会另外开辟一块内存空间,和父进程相互独立,互不影响

进程相关函数使用

os.getpid() 获取当前进程的PID号

  返回值:返回PID号

os.getppid() 获取父类进程的进程号

  返回值:返回PID号

pythonNet day04
pythonNet day04

 1 import os 
 2 from time import sleep
 3 
 4 pid = os.fork()
 5 
 6 if pid < 0:
 7     print("创建进程失败!")
 8 # 子进程
 9 elif pid == 0:
10     print("Child PID:",os.getpid())
11     print("Get parent PID",os.getppid())
12 # 父进程
13 else:
14     sleep(0.5)
15     print("Parent PID:",os.getpid())
16     print("Get child PID:",pid)

View Code

os._exit(status)  退出进程

  参数:进程的退出状态  整数

sys.exit([status])  退出进程

  参数:默认为0  如果传入一个整数则表示退出状态;如果是字符串则表示退出时打印内容

  sys.exit([status])可以通过捕获SystemExit异常阻止退出

pythonNet day04
pythonNet day04

1 import os,sys
2 
3 # os._exit(0)
4 try:
5     sys.exit("退出")
6 except SystemExit as e:
7     print("退出原因:",e)    #退出原因: 退出
8 
9 print("Process end")

View Code

孤儿进程:父进程先于子进程退出,此时子进程就会变成孤儿进程

  孤儿进程会被系统指定的进程收养,即系统进程会成为该孤儿进程新的父进程。孤儿进程退出时该父进程会处理退出状态

僵尸进程:子进程先与父进程退出,父进程没有处理子进程退出状态,此时子进程成为僵尸进程

  僵尸进程已经结束,但是会滞留部分PCB信息在内存,大量的僵尸会消耗系统资源,应该尽量避免

父进程处理子进程退出状态

  pid,status = os.wait()  在父进程中阻塞等待处理子进程的退出

  返回值:  pid 退出的子进程的PID号

        status  子进程的退出状态

pid,status = os.waitpid(pid,option)

功能:同wait

参数:pid  -1  表示任意子进程退出

      >0  整数  指定PID号的子进程退出

  option 0 表示阻塞等待

      WNOHANG  表示非阻塞

  返回值:同wait

waitpid(-1,0) ===== wait()

补充:

os.path.exists(file)

功能 : 判断一个文件是否存在
参数 : 文件
返回值 : 存在 True 不存在 False

os.remove()
os.unlink()
功能 : 删除一个文件
参数 : 要删除的文件

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/159330.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!