• 2018.11.09python学习第三十七天


    一:线程理论

    1.什么是线程
    	在传统操作系统中,每个进程用一个地址空间,而且默认就有一个控制线程
    	线程顾名思义,就是一条流水线工作的过程,一条流水线必须属于一个车间,一个车间的工作过程是一个进程。
    	车间负责把资源整合到一起,是一个资源单位,而一个车间内至少有一条流水线
    	流水线的工作需要电源,电源就相当于CPU
        所以,进程只是用来把资源集中到一起(进程只是一个资源单位,或者说是资源集合),而线程才是CPU上的执行单位。
        多线程(即多个控制线程)的概念是,在一个进程中存在多个控制线程,多个控制线程共享该进程的地址空间,相当于一个车间内有多条流水线,都共用一个车间资源。
    
    2.线程与进程的区别
    1.# 线程的创建开销小
    2.# 线程共享创建它的进程的namespace,进程有自己的namespace
    3.# 线程可以直接访问其进程的数据,而进程拥有自己父进程的数据的副本
    4.# 线程是CPU执行单位,而进程是一个资源单位
    

    二:开启线程的两种方式

    方式一:导入模块
    from threading import Thread
    
    def task():
    	print('m')
    
    # 创建线程对象
    t = Thread(target = task)
    # 执行线程
    t.start()
    
    方式二:创建类
    from threading import Thread
    class Mythread(Thread):
    	def run():
    		print('子线程任务')
    # 创建一个对象		
    m = Mythread()
    # 执行对象
    m.start()
    

    三:线程特性介绍

    from threading import Thread,current_thread,active_count,enumerate
    import time
    
    def task():
    	print('子进程...')
    	time.sleep(1)
    	print(current_thread())
    	
    t = Thread(target = task,name ='aaa')
    t.daemon = True		
    print(t.name)
    t.start()
    
    print(active_count())
    print(enumerate())
    print('over')
    
    
    active_count()		# 获取当前活跃线程的数量
    enumerate()			# 返回活跃的线程对象枚举
    t.daemon = True		# 守护线程,执行顺序和进程一样
    current_thread()	# 获取当前线程对象
    

    四:守护线程

    无论是进程还是线程,都遵循:守护xxx会等待主xxx运行完毕后被销毁
    需要强调的是:运行完毕并非终止运行
    from threading import Thread
    import time
    def sayhi(name):
    	time.sleep(2)
    	print('%s say hello' %name)
    
    if __name__ == '__main__':
    	t = Thread(target = sayhi,args = ('aaa',))
    	t.setDaemon(True)
    	t.start()
    
    	print('主线程')
    	print(t.is_alive)
    

    五:线程互斥锁

    # 多线程是可以共用同一个进程的数据的,所以在共用这些数据的同时,会产生对数据的竞争,竞争# 带来的就是错乱,所以,我们同样需要用锁,来将这些竞争变得有序
    
    from threading import Thread,Lock
    mutex = Lock()
    
    def task1():
    	mutex.acquire()
    	for i in range(100):
    		print('====')
    	mutex.release()
    	
    def task2():
    	mutex.acquire()
    	for i in range(100):
    		print('!!!!!!')
    	mutex.release()
    
    def task3():
    	mutex.acquire()
    	for i in range(100):
    		print('****')
        mutex.release()
    
    t1 = Thread(target=task1)
    t2 = Thread(target=task2)
    t3 = Thread(target=task3)
    
    t1.start()
    t2.start()
    t3.start()
    

    六:死锁

    from threading import Thread,Lock
    import time
    
    mutex1 = Lock()
    mutex2 = Lock()
    
    def task():
    	mutex1.acquire()
    	print('aaa')
    	time.sleep(2)
    	mutex2.acquire()
    	print('bbb')
    	mutex2.release()
    	mutex1.release()
    	
    def func():
    	mutex2.acquire()
    	print('ccc')
    	mutex1.acquire()
    	print('ddd')
    	time.sleep(2)
    	mutex1.release()
    	mutex2.release()
    
    t1 = Thread(target = task)
    t2 = Thread(target = func)
    t1.start()
    t2.start()
    
    print('s')
    

    七:递归锁

    from threading import Thread,RLock
    
    mutex = RLock()
    def task():
    	mutex.acquire()
    	print('aaa')
    	mutex.acquire()
    	print('bbb')
    	
    t = Thread(target=task)
    t.start()
    	
    # 如果是mutex=Lock的话,第8行打印不出来,因为第一次锁没有被mutex.release()释放,会# 处于锁死的状态。
    

    八:信号量

    from threading import Thread,Semaphore,current_thread,active_count
    
    sm = Semaphore(2)
    
    def task():
    	sm.acquire()
    	for i in range(10):
    		print(current_thread())
    		time.sleep(0.5)
    	sm.release()
        
    def task2():
        for i in range(10):
            print(current_thread())
            time.sleep(0.5)
    
    for i in range(5):
        Thread(target=task).start()
        Thread(target=task2).start()
    print(active_count())
    
    # 用于控制 同时执行被锁定代码的线程数量 也就是线程并发数量
    # 也是一种锁
    

    九:线程和进程的区别

    1.# 进程是一个资源单位,一个进程可以包含多个线程
    2.# 多个线程之间可以共享区域
    3.# 线程启动的消耗的资源较小
    
  • 相关阅读:
    Project和Module的介绍
    2016-10-27~2016-11-12面试总结
    读写分离的概念(转)
    hashmap和hashtable,arraylist和vector的区别
    如何删除数据库表的重复数据
    Iterator和ListIterator的区别
    性能提升
    Oracle 查询并修改
    oracle数据库中VARCHAR2(50 CHAR) 和VARCHAR2(50) 有啥区别?
    SQL SERVER 2000安装教程图文详解
  • 原文地址:https://www.cnblogs.com/hello-yuanjing/p/9937397.html
Copyright © 2020-2023  润新知