===================================
好久么更新了 今天终于重回大家视野
希望大家在特殊时期尽量不要出门!
武汉必胜!! 中国必胜!!!
===================================
说线程之前先来说说进程池吧
当需要创建的子进程数量不多时,我们可以直接利用multiporcessing中的Process动态生成多个进程,
但是如果现在有100个任务需要处理,那我们需要多少个子进程呢,如果我们创建100个子进程也可以实现,但是资源比较浪费。我们也可以创建指定个数个子进程,
例如
只创建10个子进程,让着10个子进程重复的执行任务,这样就节约了资源。
就比如我们去景区湖上游玩,游船是重复利用的。
我们可以使用multiprocessing模块提供的Pool类,也就是进程池,可以到达进程重复利用。泸沽岛
创建进程池对象的时候可以指定一个大进程数,当有新的请求提交到进程池中,如果池中的进程数还没有满,那么就会创建一个新的进程用来执行该请求,但是如果池中的进程数满了,该请求就会等待,知道进程池中的进程有结束的了,才会使用这个结束的进程来执行新的任务。
join 主进程等待所有子进程执行完毕,必须在close之后。
close 等待所有进程结束才关闭线程池
小练习:下载器
import time
from multiprocessing import Pool
def down_load(movie_name):
"""下载器"""
for i in range(5):
print("电影:{},下载进度{}%".format(movie_name,(i/4*100)))
time.sleep(1)
return movie_name
def alert(movie_name):
print("电影:{}下载完成了。。。。".format(movie_name))
if __name__=="__main__":
movie_list=["钢铁侠","蜘蛛侠","美国队长","死侍","黑豹","黑寡妇"]
pool = Pool(3) # 创建进程池
for movie_name in movie_list:
# 调用进程池
pool.apply_async(down_load,(movie_name,),callback=alert)
pool.close()
pool.join()
结果:
电影:钢铁侠,下载进度0.0%
电影:蜘蛛侠,下载进度0.0%
电影:美国队长,下载进度0.0%
电影:蜘蛛侠,下载进度25.0%
电影:钢铁侠,下载进度25.0%
电影:美国队长,下载进度25.0%
电影:钢铁侠,下载进度50.0%
电影:蜘蛛侠,下载进度50.0%
电影:美国队长,下载进度50.0%
电影:钢铁侠,下载进度75.0%
电影:蜘蛛侠,下载进度75.0%
电影:美国队长,下载进度75.0%
电影:钢铁侠,下载进度100.0%
电影:蜘蛛侠,下载进度100.0%
电影:美国队长,下载进度100.0%
电影:死侍,下载进度0.0%
电影:蜘蛛侠下载完成了。。。。
电影:黑豹,下载进度0.0%
电影:钢铁侠下载完成了。。。。
电影:美国队长下载完成了。。。。
电影:黑寡妇,下载进度0.0%
电影:死侍,下载进度25.0%
电影:黑豹,下载进度25.0%
电影:黑寡妇,下载进度25.0%
电影:死侍,下载进度50.0%
电影:黑豹,下载进度50.0%
电影:黑寡妇,下载进度50.0%
电影:黑豹,下载进度75.0%
电影:死侍,下载进度75.0%
电影:黑寡妇,下载进度75.0%
电影:黑豹,下载进度100.0%
电影:死侍,下载进度100.0%
电影:黑寡妇,下载进度100.0%
电影:黑豹下载完成了。。。。
电影:死侍下载完成了。。。。
电影:黑寡妇下载完成了。。。。
1、 线程概念
由于进程是资源拥有者,创建、撤消与切换存在较大的内存开销,因此需要引入轻型进程即线程,
进程是资源分配的小单位,线程是CPU调度的小单位(程序真正执行的时候调用的是线程).
每一个进程中至少有一个线程
2.
线程之间共享全局变量
import threading
g_num=100
def work1():
global g_num
g_num+=1
print("work--->",g_num)
def work2():
print("work2--->",g_num)
def main():
t1=threading.Thread(target=work1)
t2=threading.Thread(target=work2)
t1.start()
t2.start()
if __name__ == '__main__':
main()
量的问题
多线程开发的时候共享全局变量会带来资源竞争效果。也就是数据不安全。
import time
import random
from threading import Thread
g_num=100
def work1():
global g_num
for i in range(3):
g_num+=1
time.sleep(random.random())
print("in work,g_num=%d"%g_num)
def work2():
global g_num
# g_num+=1
for i in range(3):
g_num+=1
time.sleep(random.random())
print("in work2,g_num=%d"%g_num)
if __name__ == '__main__':
t1=Thread(target=work1)
t2=Thread(target=work2)
t1.start()
t2.start()
今天先到这里 明天见!