python_高级进阶(3)线程,,线程进程只是用来把资


线程

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

线程的好处

开启进程的开销非常大,比开启线程的开销大很多.
开启线程的速度非常快.要快几十倍到上百倍.
线程线程之间可以共享数据,进程与进程之间需借助队列等方法实现通信.

线程的应用

该进程肯定需要办不止一件事情,比如监听键盘输入,处理文字,
定时自动将文字保存到硬盘,这三个任务操作的都是同一块数据,
因而不能用多进程。只能在一个进程里并发地开启三个线程,如果是单线程,
那就只能是,键盘输入时,不能处理文字和自动保存,自动保存时又不能输入和处理文字。

开启线程两种方式

方式一

# 第一种方式# from threading import Thread# import time## def task(name):#     print(f'{name} is running')#     time.sleep(1)#     print(f'{name} is gone')#### if __name__ == '__main__':##     t1 = Thread(target=task,args=('A',))#     t1.start()#     print('===主线程')  # 线程是没有主次之分的.

方式二

 from threading import Thread# import time## class MyThread(Thread):##     def __init__(self,name,l1,s1):#         super().__init__()#         self.name = name#         self.l1 = l1#         self.s1 = s1#     def run(self):#         print(f'{self.name} is running')#         time.sleep(1)#         print(f'{self.name} is gone')## if __name__ == '__main__':#     t1 = MyThread('B', [1,2,3], '180')#     t1.start()#     print('=====主线程')

多线程与多进程开启速度区别.

多进程:

from threading import Thread# from multiprocessing import Process# import os## def work():#     print('hello')## if __name__ == '__main__':#     #在主进程下开启线程#     t=Process(target=work)#     t.start()#     print('主线程/主进程')

多线程

 from threading import Thread# import time## def task(name):#     print(f'{name} is running')#     time.sleep(1)#     print(f'{name} is gone')#### if __name__ == '__main__':##     t1 = Thread(target=task,args=('海狗',))#     t1.start()#     print('===主线程')  # 线程是没有主次之分的.

线程进程

多进程:

# from multiprocessing import Process# import time# import os# def task(name):#     print(f'子进程: {os.getpid()}')#     print(f'主进程: {os.getppid()}')### if __name__ == '__main__':##     p1 = Process(target=task,args=('A',))  # 创建一个进程对象#     p2 = Process(target=task,args=('A',))  # 创建一个进程对象#     p1.start()#     p2.start()#     print(f'==主{os.getpid()}')

多线程

 from threading import Threadimport osdef task():    print(os.getpid())if __name__ == '__main__':    t1 = Thread(target=task)    t2 = Thread(target=task)    t1.start()    t2.start()    print(f'===主线程{os.getpid()}')

同一个进程内线程共享内部数据

# from threading import Thread# import os## x = 3# def task():#     global x#     x = 100## if __name__ == '__main__':##     t1 = Thread(target=task)#     t1.start()#     t1.join()#     print(f'===主线程{x}')# 同一进程内的资源数据对于这个进程的多个线程来说是共享的.

线程的相关其他方法

from threading import Threadfrom threading import currentThreadfrom threading import enumeratefrom threading import active_countimport os,timex=3def task():    time.sleep(1)    print('123456')if __name__=="__main__":    t1=Thread(target=task,name='线程1')    t2= Thread(target=task, name='线程2')    t1.start()    t2.start()    # time.sleep(2)    # print(t1.isAlive())#判断t1线程是否活着    # print(t1.getName())#获取t1线程名字    # t1.setName('子线程1')#修改名字    # print(t1.name)#获取线程名字    #threading方法    print(currentThread())#获取当前线程的对象    print(enumerate())#返回一个列表包含所有线程的对象    print(active_count())#获取线程数    print(f'++++主线程{os.getpid()}')

互斥锁程

from threading import Thread# import time# import random# x = 100## def task():#     time.sleep(random.randint(1,2))#     global x#     temp = x#     time.sleep(random.randint(1, 3))#     temp = temp - 1#     x = temp### if __name__ == '__main__':#     l1 = []#     for i in range(100):#         t = Thread(target=task)#         l1.append(t)#         t.start()##     for i in l1:#         i.join()#     print(f'主线程{x}')# 多个任务公抢一个数据,保证数据的安全的目的,要让其串行from threading import Threadfrom threading import Lockimport timeimport randomx = 100def task(lock):    lock.acquire()    # time.sleep(random.randint(1,2))    global x    temp = x    time.sleep(0.01)    temp = temp - 1    x = temp    lock.release()if __name__ == '__main__':    mutex = Lock()    l1 = []    for i in range(100):        t = Thread(target=task,args=(mutex,))        l1.append(t)        t.start()    time.sleep(3)    print(f'主线程{x}')

守护线程

join: 阻塞 告知主线程要等待我子线程执行完毕之后再执行主线程# from threading import Thread# import time## def task(name):#     print(f'{name} is running')#     time.sleep(1)#     print(f'{name} is gone')#### if __name__ == '__main__':#     start_time = time.time()#     t1 = Thread(target=task,args=('海狗',))#     t2 = Thread(target=task,args=('海狗1',))#     t3 = Thread(target=task,args=('海狗2',))##     t1.start()#     t1.join()#     t2.start()#     t2.join()#     t3.start()#     t3.join()##     print(f'===主线程{time.time() - start_time}')  # 线程是没有主次之分的.# 守护线程# 回忆一下守护进程# from multiprocessing import Process# import time### def foo():#     print(123)#     time.sleep(1)#     print("end123")### def bar():#     print(456)#     time.sleep(2)#     print("end456")## if __name__ == '__main__':##     p1 = Process(target=foo,)#     p2 = Process(target=bar,)##     p1.daemon = True#     p1.start()#     p2.start()#     print('====主')# 守护线程# from threading import Thread# import time### def sayhi(name):#     print('你滚!')#     time.sleep(2)#     print('%s say hello' %name)## if __name__ == '__main__':#     t = Thread(target=sayhi,args=('egon',))#     # t.setDaemon(True) #必须在t.start()之前设置#     t.daemon = True#     t.start()  # 线程的开启速度要跟进程开很多##     print('主线程')# from threading import Thread# import time## def foo():#     print(123)  # 1#     time.sleep(1)#     print("end123")  # 4## def bar():#     print(456)  # 2#     time.sleep(3)#     print("end456")  # 5### t1=Thread(target=foo)# t2=Thread(target=bar)## t1.daemon=True# t1.start()# t2.start()# print("main-------")  # 3# 主线程什么时候结束???# 守护线程 等待非守护子线程以及主线程结束之后,结束.# from threading import Thread# import time## def foo():#     print(123)  # 1#     time.sleep(3)#     print("end123")  # 4## def bar():#     print(456)  # 2#     time.sleep(1)#     print("end456")  # 5### t1=Thread(target=foo)# t2=Thread(target=bar)## t1.daemon=True# t1.start()# t2.start()# print("main-------")  # 3'''123456main-------end123end456'''# from threading import Thread# import time## def foo():#     print(123)#     time.sleep(3)#     print("end123")## def bar():#     print(456)#     time.sleep(1)#     print("end456")### t1=Thread(target=foo)# t2=Thread(target=bar)## t1.daemon=True# t1.start()# t2.start()# print("main-------")

python_高级进阶(3)线程

评论关闭