1.简述你对进程的理解
进程是应用程序在操作系统中的一种实例表现,一个应用程序至少会对应一个进程。
进程是系统进行资源分配基本单位,每启动一个进程操作系统都需要为其分配运行资源。
在创建子进程时,子进程会复制当前父进程的执行环境。
线程是依附在进程里面的,没有进程就没有线程,一个进程默认提供一条线程,进程可以创建多个线程
2.进程在执行过程中的状态有几种?
就绪态:运行的条件都已经慢去,正在等在cpu执行
执行态:cpu正在执行其功能
等待态:等待某些条件满足,例如一个程序sleep了,此时就处于等待态
1.UDP和TCP哪种协议可以发送广播消息?如何发送广播消息?
复习UDP和TCP的区别
UDP(TCP是一对一连接的)
设置socket选项为广播:setsockopt(socket.SOL_SOCK,socket.SO_BROADCAST,True),并设置发送目的地址为广播地址("xxx.xxx.xxx.255")
2.什么是程序?什么是进程?
程序是一些可执行的静态文件,比如我们写的**.py
一个程序运行起来后,代码+用到的资源 称之为进程,它是操作系统分配资源的基本单元
3.进程和线程的区别?
定义的不同:
区别:
优缺点:
4.进程的状态有哪些,分别表示什么含义?
就绪态:运行的条件都已经慢去,正在等在cpu执行
执行态:cpu正在执行其功能
等待态:等待某些条件满足,例如一个程序sleep了,此时就处于等待态
5.进程的创建方式?启动方式?
p = multiprocessing.Process(target=func_name) #不要加括号
p.start()
6.如何查看当前进程信息?
multiprocessing.current_process()
7.获取当前进程编号的方式?
current_process.pid
os.getpid()
8.如何获取父进程的编号?
os.getppid()
9.怎么根据进程号强制销毁对应进程?
os.kill(pid, 9)
10.创建线程常用参数及意义?
group:进程组,目前只能设置为None
target:要执行的任务函数,不加括号
name:指定进程名
args:给任务函数传参,类型为元组
kwargs:给任务函数传参,类型为字典,键名为形参
11.完成TCP文件下载器多线程版本 客户端
import threading,os
from socket import *
def down_load_file(recv_data):
recv_data = recv_data.decode()
index = recv_data.find(" ")
file_name =recv_data[0:index]
print(file_name,"----")
file_content = recv_data[index+1:]
with open(file_name,'w') as f:
f.write(file_content)
def main():
# 创建socket
tcp_client_socket = socket(AF_INET, SOCK_STREAM)
# 目的信息
server_ip = input("请输入服务器ip:")
server_port = int(input("请输入服务器port:"))
# 链接服务器
tcp_client_socket.connect((server_ip, server_port))
# 输入需要下载的文件名
dir_name = input("请输入要下载的文件夹名:")
# 发送文件下载请求
tcp_client_socket.send(dir_name.encode("utf-8"))
new_dir = "[download]"+dir_name
os.mkdir(new_dir)
os.chdir(new_dir)
while True:
# 接收对方发送过来的数据
recv_data = tcp_client_socket.recv(1024*1024)
if recv_data:
t = threading.Thread(target=down_load_file,args=(recv_data,))
t.start()
# 关闭套接字
tcp_client_socket.close()
if __name__ == "__main__":
main()
12TCP文件下载器多线程版本 服务端
import threading
from socket import *
import sys,os
def send_file(sock,file_name):
try:
with open(file_name,"r") as f:
content = file_name+' '+f.read()
sock.send(content.encode())
except Exception as e:
print(e)
print("结束")
def main():
if len(sys.argv) != 2:
print("请按照如下方式运行:python3 xxx.py 7890")
return
else:
# 运行方式为python3 xxx.py 7890
port = int(sys.argv[1])
# 创建socket
tcp_server_socket = socket(AF_INET, SOCK_STREAM)
# 本地信息
address = ('', port)
# 绑定本地信息
tcp_server_socket.bind(address)
# 将主动套接字变为被动套接字
tcp_server_socket.listen(128)
while True:
# 等待客户端的链接,即为这个客户端发送文件
client_socket, clientAddr = tcp_server_socket.accept()
# 接收对方发送过来的数据
dir_name = client_socket.recv(1024*1024)
if dir_name:
os.chdir(dir_name)
file_list =os.listdir("./")
for i in file_list:
t = threading.Thread(target=send_file,args=(client_socket,i))
t.start()
# 关闭监听套接字
tcp_server_socket.close()
if __name__ == "__main__":
main()
13. 进程能否共享全局变量?
不能,他们拥有的是独立的空间和资源
14. 主进程是否等待子进程?
是的,但是异步方式添加到进程池时,主进程不会等待
15. 如何让主进程退出时不等待子进程?
设置子进程的daemon属性为True:p.daemon=True
p.terminate()
16. 进程间是怎么进行通信的?
进程拥有相互独立的空间和资源,要进行通信需要借助Queue()
17. 进程池的作用?
如果需要创建很多的子进程时,进程池会大大的节省工作代码量
节省创建和回收进程资源的开销
18. 进程池使用流程?
常见pool对象----添加任务(同步和异步的方式)----关闭
19.进程中进程间如何通信
使用multiprocessing.Manager().Queue()