1.多线程等待
import threading,time
def run():
# time.sleep(3)
print('哈哈哈')
start_time = time.time()
threads = [] #存放启动的5个线程
for i in range(5):
t = threading.Thread(target=run) #五个线程每个都不一样,分别独立
t.start()#
threads.append(t)
for lyl in threads: #主线程循环等待5个子线程执行结束
lyl.join() #主线程依次等待子线程,join()就是等待方法。
end_time = time.time()
print('run_time..',end_time-start_time)
#######
主线程: 默认有个主线程
子线程:主线程启动子线程
问题?? 如果这个函数里面有返回值的话,怎么获取呢?
子线程运行的函数,如果里面有返回值的话,是不能获取到的 只能在外面定义一个list或者字典来存每次处理的结果。
通常情况下 电脑CPU有几核,那么只能同时运行几个线程。但是呢,python的多线程,只能利用一个CPU的核心。(这个是py设计时的缺点)
2.线程锁
GIL 称为 全局解释器锁。
锁呢就是,在多个线程同时修改一个数据的时候,可能会把数据覆盖,在python2里面需要加锁。
python3里面不加锁也无所谓,默认会自动帮你加锁
import threading,time
num = 1
lock = threading.Lock() #申请一把锁
def run():
time.sleep(1)
global num
lock.acquire() #加锁 acquire()
num+=1
lock.release() #解锁 release()
ts = []
for i in range(100):
t = threading.Thread(target=run)
t.start()
ts.append(t)
[t.join() for t in ts] #使用列表生成式进行等待
print(num)
3.守护线程
只要主线结束,那么子线程立即结束,不管子线程有没有运行完成
import threading,time
def run():
time.sleep(3)
print('哈哈哈')
for i in range(50):
t = threading.Thread(target=run)
t.setDaemon(True) #把子线程设置成为守护线程 t.setDaemon(True)
t.start()
print('Done,运行完成。')
time.sleep(3) #如果不等待就直接Done,运行完成后就完了
4.多进程
import multiprocessing,threading #导入多进程模块
def my():
print('哈哈哈')
def run(num):
for i in range(num):
t = threading.Thread(target=my)
t.start()
if __name__ == '__main__': #启动多进程必须加这个,模块要求
for i in range(5):
p = multiprocessing.Process(target=run,args=(6,)) #启动一个进程,进程中添加线程(这里通过run函数调用多线程)对于run中参数有args给出,但是当有一个参数的时候
格式一定要加,号,比如args=(6,)。这句会执行5个进程,每个进程会有6个线程。
p.start()
5.关于多进程和多线程的选择??
多进程
多用于处理CPU密集型任务,比如需要计算能力
多线程
多用于IO密集型任务 不需要占用cpu,只是简单需要安排调度一下就可。
Input Ouput