开线程的第一种方式:
from multiprocessing import Process #导入进程
from threading import Rhread #导入线程
import time
def task(name):
print('%s is runing'%name)
time.sleep(1)
print('%s iis over')
#开启线程不需要再main下面执行代码 直接书写就可以
#但是我们还是习惯性的将启动命令卸载main下面
t=Thread(target=task,args=('egon,'))
p=Process(target=task,args=('jason,'))
p.start()
t.start()#创建线程
print(主)
线程的代码会先打印 线程的开销非常小 几乎是代码一致性线程就已经创建了
开线程的第二种模式(用类):
from threading import Thread
import time
class MyThead(Thraed):
def __init__(self,name): 这种读作双下init方法最标准的读法针对双下划线开头和结尾的读作双下xxx
重写了别人的方法,又不知道别人的方法里有啥 就先调用父类的方法
super().__init__() 先调用
self.name=name 再做额外的操作
def run(self):
print('%s is running',%self.name) 当函数需要传参的话可以用形参或者闭包
tcp服务端实现并发的效果:
import socket
from threading import Thread
from multiprocessing import Process
服务端:
1.要有固定的ip和PORT
2.要有24小时不间断提供服务
3.能够支持并发
server=socket.socket() # 括号里不写默认TCP协议
server.bin(('127.0.0.1',8080)) 绑定一个it的端口
server.listen(5)
#将服务的代码单独封装成一个函数
def talk(conn):
#通信循环
while True:
try:
date=conn.recv(1024)
#针对Mac Linux客户端断开连接后
if len(data)==0:break
print(data.decode('utf-8'))
conn.send(data.upper())
except ConnectionReseError as e:
print(e)
break
coon.close()
#链接循环:
while Ture:
conn,addr=server.accept() #接客人
#叫其他人来服务
t=Thread(target=talk,args=(conn,))开线程
t.strat()
客户端:
import socket
client.=socket.socket()
cliemt.connect((127.0.0.1),8080)
while True:
client.send(b'hello word')
data=client.recv(1024
peint(data.decode('utf-8')
线程对象join方法:
from threading import Thread
import time
def task(name):
print('%s is running'%name)
time.sleef(30
print('%s is over'%name)
if __name__='__main__':
t=Thread(target=task,args=('egon'))
t.start()
t.join() #主线程等待子线程运行结束
print('主')
同一个进程下的多个线程数据是是共享的
线程对象及其他方法:
active_count() #统计当前正在活跃的线程数
current_thread().name # 获取当前线程的名字
守护线程:主线程运行结束之后不会立刻结束,会等待所有其他非守护线程结束才会结束,因为主线程的结束意味着所在的进程的结束
开守护:t.daemon=True
GIL全局解释器锁
评审:小猿取经磨课原密码:xiaoyuanqujing@666
在cpython解释器中GIL是一把互斥锁,用来组织同一个进程下多个线程的同时执行
Python有cpython\jpython\pypypython三种 我们一般用的是cpython
同一个金成宰的多个线程无法利用多核优势
重点:
1.GIL不是Python的特点 而是cpython解释器的特点
2.GIL是保证解释器级别(线程与线程之间)的数据的安全
3.GIL会导致同一个进程喜爱的多个线程的无法同时执行
4.针对不同的数据还是需要加不同的锁处理
5.解释型语言的通病 :同一个进程下多个线程无法利用多核优势
标签:__,name,Thread,线程,print,import From: https://www.cnblogs.com/97zs/p/17716678.html