线程
什么是线程?
线程是轻量的进程,是程序执行流最小的单元,一个标准的线程由线程ID、当前计算机的指令指针、寄存器集合和堆栈组成。线程是进程的实体,是被系统独立调度和分派的基本单元。线程不拥有私有的系统资源,但可以与同属一个进程中的其他线程共享进程所拥有的全部资源,一个线程可以创建和撤销另一个线程,同一个进程中的多个线程可以并发执行。
几核处理器只能同时处理几个线程。多线程执行顺序看起来是同时进行的,实际上是cpu在多个线程之间快速切换执行,也就是说一个线程被分配的时间片完成后,线程执行的信息被保存下来了,cpu执行下一个线程,再到cpu读取该线程信息时并执行该线程。
可以参考如下网址:
https://blog.csdn.net/u014421556/article/details/79666409
了解实际程序运行中线程状态。
创建线程
import threading
-
函数式创建
threading.Thread(target=None, name=None, args=()) -
创建线程类
继承threading.Thread
重写run方法
start启动
进程
什么是进程?
进程是指正在执行的程序,是程序正在运行的一个实例。它是由程序指令、从文件、其他程序读取的数据或系统用户的输入组成。每次执行程序时,操作系统会创建一个新的进程去运行程序指令,每个进程由唯一的pid表示。
单个程序中需要多个进程完成不同的工作,就叫多进程,多进程主要用来cpu密集型任务,如大量的数学计算,每个进程是独立的,不会共享数据。
创建进程
from mutilprocessing import Process
- 函数式创建
Porcess(group=None, target=none,name= none,arg=(), kwargs={},*,daemon=none) - 创建进程类
继承multiprocessing.Process
重写run方法
start启动
通信
了解OSI七层网络模型,数据在网络传输过程,是封装与解封装的过程,发送方通过各种封装处理,把数据转换成比特流形式,比特流在信号传传输的硬件媒介中传输,接收方再把比特流进行解封装处理。

参考网址: https://www.cnblogs.com/qishui/p/5428938.html
https://blog.csdn.net/andrewgithub/article/details/81603205
https://baike.baidu.com/item/七层模型/1441391?fr=aladdin
TCP/IP 四层网络结构图

TCP/IP协议 在网络层有两个重要的协议:TCP(传输控制协议) ,UDP(用户数据报协议)。两者之间区别细节方面,可以网上搜索参考。TCP主要是点对点,面向连接的,实行可靠的传输,会有三次握手。UDP则是无连接的,不可靠的传输协议,但是速度快,可能再传输过程中有丢包现象。
代码
上面讲了这些 下面开始叙述代码。
- 多线程与网络编程
import socket
import time
serverSocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
port = 12345
serverSocket.bind(("192.168.1.103",port))
serverSocket.listen(10)
print("start socket server ...")
while True:
#accept() 返回的是连接客户端连接,地址(客户端的ip,以及端口号)
clientSocket,addr = serverSocket.accept()
print("从{0}连接上客户端".format(addr))
while True:
clientData = clientSocket.recv(1024).decode("utf-8")
print("服务器端接收消息:",clientData)
if(not clientData or clientData == 'quit'):
break
msg = "服务器当前时间={0}".format(time.ctime())
clientSocket.send(msg.encode("utf-8"))
clientSocket.close()
serverSocket.close()
import socket
clientSocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
port = 12345
clientSocket.connect(("192.168.1.103",port))
print("start socket client ...")
wile True:
data = input("请在客户端输入发送的内容:")
if not data:
break
clientSocket.send(data.encode("utf-8"))
serverData = clientSocket.recv(1024)
if not serverData:
break
print("客户端接收的信息为:",serverData.decode("utf-8"))
clientSocket.close()
服务端

客户端

- 传送文件
import socket
import os
serverSocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
port = 12346
serverSocket.bind(("192.168.1.103",port))
serverSocket.listen(10)
fileName = 'udp20190831184608.png'
while True:
#accept() 返回的是连接客户端连接,地址(客户端的ip,以及端口号)
clientSocket,addr = serverSocket.accept()
print("start file transport ...")
with open(fileName, 'rb') as file:
fileSize = os.stat(fileName).st_size
clientSocket.send(str(fileSize).encode('utf-8'))
for line in file:
clientSocket.send(line)
import socket
clientSocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
port = 12346
clientSocket.connect(("192.168.1.103",port))
fileinfo = clientSocket.recv(1024).decode('utf-8')
fileSize = (int)(fileinfo)
print("filetotal: {0}".format(fileSize))
recvSize = 0
fileName = "test.png"
with open(fileName, 'wb') as file:
while recvSize < fileSize:
data = clientSocket.recv(1024 * 5)
print("recv size ")
recvSize += len(data)
file.write(data)
else:
print("fileTotalSize= {0}".format(recvSize))
print("----------file recv ok!----------------")
结果:

本文深入探讨了线程与进程的概念,解释了它们在程序执行中的作用,包括线程的轻量化特性、进程的独立性,以及它们如何共享资源。同时,文章提供了Python中创建线程和进程的代码示例,并讨论了多线程和多进程的应用场景。

849

被折叠的 条评论
为什么被折叠?



