进程的出现
原来一台服务器只能执行一个任务。
进程的出现,可以让一台服务器处理多个任务。多个任务间进行切换,记录每个任务当前执行到哪里,记录有哪些数据。然后进行切换
每个进程区分开每个任务所能占有的内存空间
进程的缺点
线程的出现:
进程就是为了隔离内存出现的。操作系统在调度进程,
进程切换所需要的资源很大
线程切换几乎不浪费资源
车间切换和人操作机器的切换所需要的人力物力都不一样,线程的切换开销非常小
进程和线程的关系
线程的特点:
使用线程的例子
线程的启动方法一:
线程的启动方法二(使用面向对象的方式):
过程分析:
同一个进程中的多个线程可能在不同cpu上运行
全局解释器锁:(对线程加锁)
数据加锁
GIL锁的切换
多线程实现qq聊天:
server端:
import socket
from threading import Threaddef func(conn):while True:conn.send(b'hello')msg = conn.recv(1024).decode('utf-8')if msg=='q':conn.close()breakprint(msg)info = input('>>>').encode('utf-8')conn.send(info)conn.close()sk=socket.socket()
sk.bind(('127.0.0.1',8080))
sk.listen()while True:conn, addr = sk.accept()t=Thread(target=func,args=(conn,)).start()
sk.close()# 子进程中不能用input
# 子线程可以
# def demo(n):
# inp=input('%s:'%n)
# print(inp)
# for i in range(5):
# t=Thread(target=demo,args=('name%s'%i,))
client端:
import socket
sk=socket.socket()
sk.connect(('127.0.0.1',8080))info=sk.recv(1024)
print(info)
msg=input('>>>').encode('utf-8')
sk.send(msg)
sk.close()
运行结果: