首页 > 技术文章 > 线程、进程的区别

lili37 2022-01-21 17:50 原文

进程:指正在运行的程序,并且具有一定的独立功能

线程:是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程;一个进程中可以有多个线程的,则这个应用程序也可以称之为多线程程序

 

单线程:有多个任务也是只能依次执行,当上一个任务执行结束后,下一个任务才开始执行

多线程:有多个任务可以同时执行

主线程:就一个程序是从main方法开始,一直执行到main方法结束,就是一个主线程

 

Python的thread模块是比较底层的模块,Python的threading模块是对thread做了一些包装,可以更加方便的被使用

 

Thread类提供了以下方法:

  run():表示线程活动的方法

  start():启动线程活动

  join(time):设置主线程等待time秒后再往下执行,time为空时默认为子线程结束,多个子线程之间设置的值会叠加;不调用join方法,主线程是默认不等待子线程的,即主线程执行主线程,子线程执行子线程

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

  getName():返回线程名

  setName():设置线程名

  threading.currentThread():返回当前执行的线程

  threading.enumerate():返回正在运行的所有线程(list),正在运行是指线程启动后、结束之前,不包括启动前和终止后的线程

  threading.activeCount():返回正在运行的线程数量

 

创建线程对象:threading.Thread(target=func,args=())

       target:指定线程执行的任务(即:函数)

          args:以元组的形式传入target函数的参数

 

继承类创建线程

  通过使用threading模块能完成多任务的程序开发,为了让每个线程的封装性更完美,可通过类来封装

  所以我们可直接从threading.Thread继承创建一个新的子类,并实例化调用start()方法启动新线程,即调用了线程的run()方法

  

 

 

线程同步

  如果多个子线程共同对某个数据修改(即全局变量),则可能出现不可预料的结果(如:数据不同步的问题),为了保证数据的正确性,需要对多个线程进行同步,同步就是协同步调,按预定的先后次序进行运行

  为了避免数据不同步的问题,就引入了锁的概念

  锁有两种状态---锁定和未锁定。每当一个线程比如‘set’要访问共享数据时,必须先获得锁定;如果已有别的线程锁定了,那么就会让“set”线程暂时停止,即同步阻塞,别的线程访问变量结束就释放锁,让下一个线程使用

  使用Thread对象的Lock和Rlock可以实现简单的线程同步,这两个对象都有acquire()方法和release()方法,对于那些需要每次只允许一个线程数据的数据,可以将其操作放到acquire和release方法之间

  

 

队列

  Python的Queue模块中提供了同步的、线程安全的队列类,包括:

    1、先进先出:FIFO(先入先出)队列Queue

    2、后进先出:LIFO(后入后出)队列LifoQueue

    3、优先级:PriorityQueue

  初始化Queue()对象时,若括号中没有传指定最大可接收的消息数量,或数量为负值,那么就代表可接受的消息数量没有上限;

  Queue模块中的常用方法

  -- Queue.qsize() :返回队列的大小,即包含的消息数量

  -- Queue.empty():如果队列为空,返回True,反之False

  -- Queue.full():如果队列满了,返回True

  -- Queue.full:与maxsize大小对应

  -- Queue.get([ block[, timeout]]):获取队列,timeout为等待时间

  -- Queue.get_nowait(item):写入队列,timeout等待时间

  -- Queue.put(item):写入队列,timeout等待时间

  -- Queue.put_nowait(item):相当于Queue.put(item, False)

  -- Queue.task_done():在完成一项工作后,Queue.task_done()函数向任务已经完成的队列发送一个信号

  --Queue.join():实际上意味着等到队列为空,再执行别的操作

 

进程之间不共享全局变量,即各用各的全局变量,互不影响

 

  

推荐阅读