线程

发布时间 2023-09-26 15:12:40作者: 朱饱饱

开线程的第一种方式:

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.解释型语言的通病  :同一个进程下多个线程无法利用多核优势