一、进程
1、什么是进程
在系统中正在运行的一个应用程序
特点:每个进程之间是独立的,每个进程运行在其专用且受保护的内存空间内
2、线程
- 什么是线程
- 1个进程想要执行任务,必须得有线程(至少有一个)
- 进程的所有任务都在线程中执行
-
特点:
串行:如果想要在1个进程中执行多个任务,那么每个任务只能按顺序逐个执行(同一时间1个线程只能执行1个任务)
3、多线程
a. 什么是多线程
- 1个进程中可以开启多条线程,每条线程可以并行(同时)(执行不同的任务)
- 多线程可以提高程序的执行效率
b. 多线程的原理
- 注意:同一时间,CPU只能处理一条线程,只有1条线程在工作(执行)
- 多线程并发(同时)执行,其实CPU快速地在多线程之间进行调度(切换)
- 劣势:线程很多时会大量消耗CPU资源
每条线程被调度执行的频次会降低(线程执行效率降低)
二、多线程程序
- 每个程序在运行的时候(进程)系统都会为这个进程创建一个线程,这个程序叫主线程,程序员自己创建的线程叫子线程
- 多个任务在一个线程中是按顺序一个一个执行的(线程串行)
- 多线程的任务同时执行
import datetime
import time
from random import randint
def download(file):
print(file, threading.current_thread()) # 获取当前线程
print(datetime.datetime.now(), '开始下载:%s' % file)
# sleep(时间):会阻塞当前线程指定的时间(单位:秒)
time.sleep(randint(5, 10))
print(datetime.datetime.now(), '下载 %s 结束' % file)
# python中怎么创建线程
# 通过threading标准库来支持多线程
import threading
if __name__ == '__main__':
print(threading.current_thread())
# 创建一个线程对象
# 方法1:
# threading.Thread(target=, args=)
# target:需要传一个需要在子线程中执行的函数(类型是function的变量)
# args: 在子线程中调用target对应的函数时,该传什么参数,以元祖的形式传入
# t1 = threading.Thread(target=download, args=('我不好',))
# t2 = threading.Thread(target=download, args=('你好不',))
# 让子线程执行任务
# t1.start()
# t2.start()
from threading import Thread, current_thread
from datetime import datetime
# a. 写一个类继承Thread类
class DownloadThread(Thread):
"""这是一个下载线程类"""
# 如果需要给run方法中传数据,通过当前类的属性来传
def __init__(self, file):
super().__init__()
self.file = file
def run(self):
print(current_thread())
print(datetime.now(), '开始下载:%s' % self.file)
# b. 重写当前类的run方法,run方法的任务就是在子线程需要执行的任务
# c. 创建当前类的对象,就是线程对象,然后还是调用start执行线程中任务
t1 = DownloadThread('aaaa')
# 注意:如果需要将run方法中的内容在子线程执行,就必须通过start方法间接调用run方法,
# 如果直接调用run方法,run方法里面的内容只会在主线程里执行,不会再子线程执行
t1.start()
import socket
from threading import Thread, current_thread
class ConversationThread(Thread):
def __init__(self, conversation:socket.socket, addr):
super().__init__()
self.conversation = conversation
self.addr = addr
def run(self):
# 保持通话
while True:
message = self.conversation.recv(1024).decode('utf-8')
print(self.addr[0], ':', message)
# 发送消息
self.conversation.send('hello'.encode('utf-8'))
def create_server():
# 创建服务
sever = socket.socket()
# 绑定ip和端口
sever.bind(('10.7.156.141', 8080))
# 监听端口
sever.listen(100)
print('开始监听')
while True:
# 创建回话
print('等待连接......')
conversation, addr = sever.accept()
print(conversation)
print(addr)
# 创建处理这个请求的子线程对象
t1 = ConversationThread(conversation, addr)
t1.start()
# 此时进程结束的条件是所有子线程全部结束或崩溃
if __name__ == '__main__':
create_server()