python 多线程编程(线程同步和守护线程)
创始人
2024-01-25 01:10:16
0

守护线程: 随着主线程的终止而终止,不管当前主线程下有多少子线程没有执行完毕,都会终止。
线程同步: join所完成的工作就是线程同步,即主线程任务结束之后,进入阻塞状态,一直等待其他的子线程执行结束之后,主线程再终止。
参考连接:守护线程和线程同步
下面探究加线程同步和守护线程的情况:

  1. 情况:各个子线程阻塞,确保线程同步,主线程等子线程运行完毕才执行
  2. 情况:各个子线程不阻塞,子线程并行,主线程等子线程运行完毕才执行
  3. 情况:各个子线程不阻塞,不确保线程同步,子线程并行,主线程不等子线程结束,子线程还在执行
  4. 情况:主线程执行完了,子线程不管有没有执行完,都要结束。

情况1:各个子线程阻塞,确保线程同步,主线程等子线程运行完毕才执行

# coding:utf-8
import time
import random
import threading
lists = ['python', 'django', 'tornado','flask', 'bs5', 'requests', 'uvloop']
new_lists = []
def work():t1= time.time()if len(lists) == 0:returndata = random.choice(lists)lists.remove(data)new_data = '%s_new' % datanew_lists.append(new_data)time.sleep(1)t2= time.time()print("线程名称{},时间{}".format(t.name, t2-t1))if __name__ == '__main__':# 主线程start = time.time()t_list = []for i in range(len(lists)):t = threading.Thread(target=work)t_list.append(t)t1 = time.time()for t in t_list:t.start()# 等待上一个子线程运行结束后再进行下一个线程,所有子线程结束才执行主线程t.join()print("当前启动线程名称{},数量{},是否存活{}".format(t.name, threading.active_count(), t.is_alive()))t2 = time.time()print("主线程分配线程的时间{}".format(t2-t1))print('old list:', lists)print('new list:', new_lists)print('time is %s' % (time.time() - start))print('主线程退出')

在这里插入图片描述

情况2:子线程并行,主线程等子线程运行完毕才执行

    for i in range(len(lists)):t = threading.Thread(target=work)# 子线程之间并行t.start()t_list.append(t)t1 = time.time()for t in t_list:# 确保所有子线程运行完,主线程才退出t.join()print("当前启动线程名称{},数量{},是否存活{}".format(t.name, threading.active_count(), t.is_alive()))

在这里插入图片描述

情况3:子线程并行,主线程不等子线程结束,子线程还在执行

若去掉t.join(),各个线程一起运行,主线程也不等待,结果如下:

    for i in range(len(lists)):t = threading.Thread(target=work)# 子线程之间并行t.start()t_list.append(t)print("当前启动线程名称{},数量{},是否存活{}".format(t.name, threading.active_count(), t.is_alive()))    

情况3

创建的线程是与需要的参数相关,想当于创建了7个线程,去同时执行,且在没有加锁的状态下,但这种方式,处理线程并发数与参数有关,且并发量过高。
下面使用线程池,使得线程数量与参数无关

if __name__ == '__main__':# 主线程start = time.time()# 创建 ThreadPoolExecutor with ThreadPoolExecutor(2) as executor: # 提交任务future_list = [executor.submit(work) for i in range(len(lists))]for future in as_completed(future_list):result = future.result() # 获取任务结果print("%s get result : %s" % (threading.current_thread().name, result))print('old list:', lists)print('new list:', new_lists)print('new_list len', len(new_lists))print('time is %s' % (time.time() - start))print('主线程退出')

在这里插入图片描述

情况4:主线程执行完了,子线程不管有没有执行完,都要结束。

    for i in range(len(lists)):t = threading.Thread(target=work)# # 启动前,先设置守护线程t.setDaemon(True)  t.start()t_list.append(t)print("当前启动线程名称{},数量{},是否存活{}".format(t.name, threading.active_count(), t.is_alive()))

在这里插入图片描述

相关内容

热门资讯

上班族创业 上班族创业 上班族... 台湾人力资源机构26日公布调查显示,台湾七成六上班族有意创业,其中35岁至40岁年龄层意愿最高,原因...
创业还是不创业?大学生和上班族... 有人开微店,有人和小伙伴组队创业,还有夫妻俩从大城市搬回老家共同创业&;&;“创业”,去年在朋友圈刷...
无论上班族还是宝妈都能做,无成... 很多年轻人心中都怀有梦想,趁着年轻干一番事业创造更有价值的自己。现在创业的人越来越多,但有些人不知如...
石家庄大学生创业调查:四石家庄...   燕赵都市报记者任国省通讯员杨飞又是一年毕业季,伴随着政策引导与社会观念的转变,以及大学生就业压力...
石家庄信息工程职业学院第四届互... 中国高校之窗6月13日,石家庄信息工程职业学院第四届“互联网+”大学生创新创业大赛暨第四届河北省“互...
我国战略性新兴产业呈现向新兴行... 当前全球新兴产业发展迅猛,新的增长点不断涌现。信息、生物、能源、材料、先进制造等领域的技术突破和跨领...
2020年中国污水处理行业发展... 4、污水年处理量增加随着污水处理厂数量增加,污水处理能力提升,我国污水年处理量大幅提升。2014年污...
深圳十大新兴行业 深圳十大新兴... 深圳商报记者季杰陈姝深圳经济最大亮点,在于“新”。新,意味着走在时代前沿。在大家还在4G尽情冲浪的时...
深圳战略性新兴产业和未来产业规... 只要几千元,一台无人机,就可以全新视角俯瞰世界;未来的小城市,也可能会用上“云轨”绿色交通,成为轨道...
中国有潜力的新兴行业 涓浗鏈... 确定不再关注此人吗确定取消文/新浪财经意见领袖专栏作家程实、钱智俊“世界赠我以创伤,而伤口将长出翅膀...