多线程

Posted fushaunglin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程相关的知识,希望对你有一定的参考价值。

进程只是用来把资源集中到一起(进程只是一个资源单位,或者说资源集合),而线程才是cpu上的执行单位

进程之间是竞争关系,线程之间是协作关系

 

为何要用多线程

多线程指的是,在一个进程中开启多个线程,简单的讲,如果多个任务共用一块地址空间,name必须在一个进程内开启多个线程,详细的讲分为4点:

1.多线程共享一个进程的地址空间

2.线程闭进程更轻量级,线程比进程更容易创建和撤销,在许多的操作系统中,创建一个线程比创建一个进程要快10到100倍,在有大量线程需要动态和修改时,这一特性很有用

3.若多个线程都是cpu密集型的,那么并不能获得性能上的增强,但是如果存在大量的计算机和大量的io处理,拥有多个线程允许这些活动彼此重叠运行,从而会加快程序的执行速度

4.在多cpu中,为了最大限度的利用多核,可以开启多个线程,比开进程开销要小得多(这一条python不适用)

 

开启线程的两种方式:

from threading import Thread

import time

def sayhi(name):

  time.sleep(2)

  print(name)

if __name__==‘__main__‘:

  t=Thread(target=sayhi,args=(‘egon‘,))

  t.start()

  print(‘主线程‘)

 

from threading import Tread

import time

class sayhi(Thread):

  def __init__(self,name):

    super().__init__()

    self.name=name

  def run(self):

  time.sleep(2)

  print(self.name)

if __name__==‘__main__‘:

  t=sayhi(‘egon‘)

  t.start()

  print(‘主线程‘)

 

在一个进程下开启多个线程与在一个进程下开启多个子进程的区别

开启多个线程的速度要快

from threading import Thread

from multiprocessing import Process

import os

 

def work():

  print(‘hellow‘)

if  __name__==‘__main__‘:

  #在进程下开启线程

  t=Thread(target=work)

  t.start()

  print(‘主进程/主线程‘,os.getpid())

  #在主进程下开启子进程

  t=Process(target=work)

  t.start()

  print(‘主线程/主进程‘,os.getpid())

同一进程内的线程之间共享进程内的数据

进程与进程之间数据隔离

 

多线程并发socket服务端

from threading import Thread

from multiprocessing import Process

from socket import *

s=socket(AF_INET,SOCK_STREAM)

s.bind((‘127.0.0.1‘,8080))

s.listen(5)

def action(conn):

  while True:

    data=conn.recv(1024)

    print(data)

    conn.send(data.upper())

if __name__==‘__main__‘:

  while True:

  conn.addr=s.accept()

  p=Tread(target=action,args=(aonn,))

  p.start()

 

客户端

from socket import *

s=socket(AF_INET,SOCK_STREAM)

s.connect((‘127.0.0.1‘,8080))

while True:

  inp=input(‘请输入‘)

  if not inp:

    continue

  s.send(inp.encode(‘utf-8‘))

  data=s.recv(1024)

  print(data.decode(‘utf-8‘))

 

 

 

线程相关的其他方法

Thread实例化对象的方法

isAlive():返回线程是否活动的

getName():返回线程名

setName():设置线程名

threading模块提供的一些方法

threading.currentThread():返回当前的线程变量

threading.enumerate():返回正在运行的线程list,正在运行指线程启动后,结束前,

不包括启动前终止后的线程

threading.activeCount():返回正在运行的线程数量,与len(threading.enumerate())有相同的结果

 

主线程等待子线程结束

 

from threading import Thread

import time 

def sayhi(name):

  time.sleep(2)

  print(name)

if __name__==‘__main__‘:

  t=Thread(target=sayhi,args=(‘egon‘))

  t.start()

  t.join()

  print(‘主线程‘)

  print(t.is_alive())

 

 

 

守护线程

无论是进程还是线程,都遵循:守护xxx会等待主xxx运行完毕后被销毁

需要强调的是:运行完毕并非终止运行

1.对主进程来说,运行完毕时主进程代码运行完毕

2.对主线程来说,运行完毕时主线程所在的进程内所有非守护线程全部运行完毕,主线程才算完毕

 

以上是关于多线程的主要内容,如果未能解决你的问题,请参考以下文章

什么是多线程,多进程?

多线程和多进程模式有啥区别

多线程Java多线程学习笔记 | 多线程基础知识

java中啥叫做线程?啥叫多线程?多线程的特点是啥

c++ 多线程与c多线程有啥区别?

IOS多线程安全(线程锁)