使用python实现多线程:
首先python的多线程是一种假的多线程;
以下是线程,进程的一些定义:
线程的简要定义是:线程都是作为利用CPU的基本单位,可并发执行,可以是程序中一个独立运行的片段,是花费最小开销的实体。
进程的简要定义是:进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体。
多线程的简要定义是:多个线程并发执行的技术。
多进程的简要定义是:一个父进程创建了几个子进程(相当于一个两个没啥关系的python程序合到一个python文件中)
可以用生物学上的作为类比:比如人体的各种器官同时工作才能维持人体的稳定,可以类比为多进程处理不同的事情,以这次新型冠状病毒为例,进程类比为免疫器官,而线程就是各种免疫细胞,进程的目的是为了消灭病毒,就申请了很多的能量和物质用,真正用这些能量和物质的就是线程,比如一堆的白细胞去追杀病毒,用的是进程申请的资源,处理的是进程的事情,多个白细胞同时工作可以类比为多线程。
注意:线程是异步的,所以类比起来比较奇怪的,你想想,一个白细胞刚刚准备吞一个病毒,结果上面说你先暂停,另一个白细胞准备去死了。。。
以下是python2相关例程:
多进程:
import multiprocessing
# 子进程1
def multiProc1(number):
time.sleep(3)
print(number)
# 子进程2
def multiProc2(number):
print(number)
# 父进程
def mainProc():
print("Welcome!!!")
# 启动两个进程(两个同时运行,不用等待结束后再启动下一个)
p = multiprocessing.Process(target=multiProc1,args =(1))
print('Child process multiProc1 will start.')
p.start()
p = multiprocessing.Process(target=multiProc1,args =(2))
print('Child process multiProc1 will start.')
p.start()
if __name__ == '__main__':
mainProc()
多进程(用的比较多的就是这个socket):
服务端:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import socket
import threading
def tcplink(sock, addr):
print('Accept new connection from %s:%s...' % addr)
sock.send(b'Welcome_To_Join_The_Conference') # 发送欢迎信息
while True:
data = sock.recv(1024) # 接收客户端信息
if not data or data.decode('utf-8') == 'exit':
break
# 关闭连接
sock.close()
print('Connection from %s:%s closed.' % addr)
def startServer():
# 配置服务端
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = '192.168.0.102' # 配置服务器IP地址
port = 8888 # 配置服务器端口号(使用1025~65535端口号)
# 绑定端口
try:
s.bind((host, port)) # 绑定端口
print("Server started successfully !")
except OSError:
return False
s.listen(5)
print('Waiting for connection...')
# 启动多线程,等待客户端连接
while True:
sock, addr = s.accept()
t = threading.Thread(target=tcplink, args=(sock, addr))
t.start()
if __name__ == '__main__':
startServer()
客户端(多运行几个客户端就可以体会到多线程的含义):
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import socket
def connectServer():
try:
# 配置客户端
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = '192.168.0.102' # 配置服务器IP地址
print('Current computer IP address:' + host)
port = 8888 # 配置服务器端口号(使用1025~65535端口号)
# 连接服务端
s.connect((host, port))
data = s.recv(1024).decode('utf-8') # 接收欢迎信息
print(data)
s.send(b'Welcome_To_Join_The_Conference') # 发送消息到服务端
except Exception,err:
print(err)
finally:
s.send(b'exit')
s.close()
if __name__ == '__main__':
connectServer()
为什么说这个python的多线程是假的多线程呢?
因为全局解释器锁的问题,说白话点就是现在的处理器大都是多核的,但是python多线程占用永远只有一个核,也就是说你是一个八核处理器,你可以用python写八个个死循环的线程,你就会发现这个cpu占用率永远只有大概12.5%左右,但是像c语言这种写的多线程,可以搞到100%,想要python的程序也能100%的占用,你试试把八个死循环线程换成多进程。