线程与threading模块
线程
进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派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\n' %res)
if __name__ == '__main__':
t1=Thread(target=talk)
t2=Thread(target=format_msg)
t3=Thread(target=save)
t1.start()
t2.start()
t3.start()
浙公网安备 33010602011771号