线程

python 线程

     线程是进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。

threading模块提供的类:  
  Thread, Lock, Rlock, Condition, [Bounded]Semaphore, Event, Timer, local。

threading 模块提供的常用方法: 
  threading.currentThread(): 返回当前的线程变量。 
  threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。 
  threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。

threading 模块提供的常量:

  threading.TIMEOUT_MAX 设置threading全局超时时间。

 

Thread类:

Thread是线程类,有两种使用方法,直接传入要运行的方法或从Thread继承并覆盖run():

方法一:
import time
import random
from threading import Thread

def piao(name):
    print('%s piaoing' %name)
    time.sleep(random.randrange(1,5))
    print('%s piao end' %name)

if __name__ == '__main__':
    t1=Thread(target=piao,args=('egon',))
    t1.start()
    print('主线程')
#


import time
import random
from threading import Thread

方法二:
class MyThread(Thread):
    def __init__(self,name):
        super().__init__()
        self.name=name

    def run(self):
        print('%s piaoing' %self.name)

        time.sleep(random.randrange(1,5))
        print('%s piao end' %self.name)

if __name__ == '__main__':
    t1=MyThread('egon')
    t1.start()
    print('')

 

好处
  • (1)易于调度。

  • (2)提高并发性。通过线程可方便有效地实现并发性。进程可创建多个线程来执行同一程序的不同部分。

  • (3)开销少。创建线程比创建进程要快,所需开销很少

2、进程的基本状态及状态之间的关系

状态:运行、阻塞、挂起阻塞、就绪、挂起就绪

状态之间的转换:

  • (1)准备就绪的进程,被CPU调度执行,变成运行态;

  • (2)运行中的进程,进行I/O请求或者不能得到所请求的资源,变成阻塞态;

  • (3)运行中的进程,进程执行完毕(或时间片已到),变成就绪态;

  • (4)将阻塞态的进程挂起,变成挂起阻塞态,当导致进程阻塞的I/O操作在用户重启进程前完成(称之为唤醒),挂起阻塞态变成挂起就绪态,当用户在I/O操作结束之前重启进程,挂起阻塞态变成阻塞态;

  • (5)将就绪(或运行)中的进程挂起,变成挂起就绪态,当该进程恢复之后,挂起就绪态变成就绪态;

3、线程和进程的关系以及区别?

** 进程和线程的关系:**

  • (1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。

  • (2)资源分配给进程,同一进程的所有线程共享该进程的所有资源。

  • (3)处理机分给线程,即真正在处理机上运行的是线程

  • (4)线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。线程是指进程内的一个执行单元,也是进程内的可调度实体.

进程与线程的区别:

  • (1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位

  • (2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行

  • (3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源.

  • (4)系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。

从程序上反映区别:

# 1、开进程的开销远大于开线程
import time
from threading import Thread
from multiprocessing import Process

def piao(name):
    print('%s piaoing' %name)
    time.sleep(2)
    print('%s piao end' %name)

if __name__ == '__main__':
    # p1=Process(target=piao,args=('egon',))
    # p1.start()

    t1=Thread(target=piao,args=('egon',))
    t1.start()
    print('主线程')
# 2、同一进程内的多个线程共享该进程的地址空间,而进程的地址内存是相互隔离的
from threading import Thread
from multiprocessing import Process

n=100
def task():
    global n
    n=0

if __name__ == '__main__':
    # p1=Process(target=task,)
    # p1.start()
    # p1.join()

    t1=Thread(target=task,)
    t1.start()
    t1.join()

    print('主线程',n)

 

posted @ 2018-06-24 20:57  笃行1995  阅读(126)  评论(0)    收藏  举报