线程
进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位。在单个进程中同时运行多个线程完成不同的工作,称为多线程。
同一进程内的多个线程是共享该进程的资源。
创建新的线程开销要远远小于开启新的进程。
threading模块
线程的threading模块与进程的multiprocessing模块很类似。
模块下的类:
Thread
active_count
enumerate
current_thread
方法:
start()
join()
daemon() 守护线程和守护进程有点不一样。主线程在执行完所有非守护线程后,主线程结束,守护线程随之结束。
示例:
rom threading import Thread,current_thread,active_count,enumerate import time def bar(): print('%s is running'%current_thread().getName() ) time.sleep(2) print('%s is over'%current_thread().getName() ) def foo(): print('%s is running' % current_thread().getName()) time.sleep(5) print('%s is over' % current_thread().getName()) if __name__ == '__main__': t1=Thread(target=bar) t2=Thread(target=foo) t1.start() t2.daemon=True t2.start() print(enumerate()) print(active_count()) print('%s is 主线程' %current_thread().getName())
输出:
Thread-1 is running Thread-2 is running [<_MainThread(MainThread, started 816)>, <Thread(Thread-1, started 7528)>, <Thread(Thread-2, started daemon 13788)>] 3 MainThread is 主线程 Thread-1 is over
PS:
多线程用于IO密集型,如socket,爬虫,web
多进程用于计算密集型,如金融分析
from multiprocessing import Process from threading import Thread import time def foo(): sum=0 for i in range(100000000): sum+=i if __name__ == '__main__': start_time=time.time() n=os.cpu_count() l=[] for i in range(n): t=Thread(target=foo,) #41s # p=Process(target=foo,) #9.89s # l.append(p) l.append(t) # p.start() t.start() for p in l: # p.join() p.join() print('time:',time.time()-start_time)
作业:
三个任务,一个接收用户输入,一个将用户输入的内容格式化成大写,一个将格式化后的结果存入文件。
from threading import Thread msg_l=[] # format_l=[] #这两个是关键呀,相当于进程中的全局变量,进程中的数据(全局变量)是共享的,任何一个线程都可以访问的到。 def talk(): #三个函数,开启三个线程,做到各司其职,互不干涉,存取数据到进程中的全局变量取就可以了。 while True: msg=input('>>: ').strip() if not msg:continue msg_l.append(msg) def format_msg(): while True: if msg_l: res=msg_l.pop() format_l.append(res.upper()) def save(): while True: if format_l: with open('db.txt','a',encoding='utf-8') as f: res=format_l.pop() f.write('%s ' %res) if __name__ == '__main__': t1=Thread(target=talk) t2=Thread(target=format_msg) t3=Thread(target=save) t1.start() t2.start() t3.start()
思路还是很6的。