Python公开课 - 多线程使用

前言

在上一章节,我们阐述了多进程的概念以及如何使用,接下来,我们会介绍Python中的多线程。

进程是资源分配的最小单位,而线程则是程序执行的最小单位。

线程与进程的区别

  1. 进程拥有独立的堆栈空间和数据段,而线程不一样,线程拥有独立的堆栈空间,但是共享数据段,它们彼此之间使用相同的地址空间,共享大部分数据,相比进程更节俭,开销比较小,切换速度也比进程快,效率高。

  2. 在通信机制上,进程之间互不干扰,相互独立,进程的通信机制相对很复杂,譬如管道,信号,消息队列,共享内存,套接字等通信机制,而线程由于共享数据段所以通信机制很方便。

  3. 属于同一个进程的所有线程共享该进程的所有资源,包括文件描述符。而不同过的进程相互独立。

  4. 线程又称为轻量级进程,进程有进程控制块,线程有线程控制块;

  5. 线程必定也只能属于一个进程,而进程可以拥有多个线程而且至少拥有一个线程;

在Python中使用线程

我们只需要使用threading这个高级模块,就可以很方便的对线程进行操作

import threading
from time import ctime,sleep


def music(func):
    for i in range(2):
        print("I was listening to %s. %s" %(func,ctime()))
        sleep(1)

def move(func):
    for i in range(2):
        print("I was at the %s! %s" %(func,ctime()))
        sleep(5)

threads = []
t1 = threading.Thread(target=music,args=(u'东风破',))
threads.append(t1)
t2 = threading.Thread(target=move,args=(u'爱在西元前',))
threads.append(t2)

if __name__ == '__main__':
    for t in threads:
        t.setDaemon(True)
        t.start()

    for t in threads:
        t.join()
    print ("all over %s" %ctime())


输出:
I was listening to 东风破. Thu Jan  3 16:22:24 2019
I was at the 爱在西元前! Thu Jan  3 16:22:24 2019
I was listening to 东风破. Thu Jan  3 16:22:25 2019
I was at the 爱在西元前! Thu Jan  3 16:22:29 2019
all over Thu Jan  3 16:22:34 2019

注意:join() 的作用是,在子线程完成运行之前,这个子线程的父线程将一直被阻塞。

线程锁

当多线程运行时,因为可以数据段是共享的,因此各个线程都可以访问,但是这样一来会产生一个问题,就是对于资源的变更会造成冲突。

例如对计算器进行累加,如果不对临界区进行控制,则会导致某个线程已经进行了累加操作,另一个线程又重复一次的情况出现。

对于这个问题,在Python中采用线程锁来解决。

count = 0
lock = threading.Lock()

def run_thread(n):
    for i in range(100000):
        # 获取锁
        lock.acquire()
        try:
            count += 1
        except:
            pass
        # 释放锁
        lock.release()

锁的好处就是确保了某段关键代码只能由一个线程从头到尾完整地执行。

坏处当然也很多,首先是阻止了多线程并发执行,包含锁的某段代码实际上只能以单线程模式执行,效率就大大地下降了。

其次,由于可以存在多个锁,不同的线程持有不同的锁,并试图获取对方持有的锁时,可能会造成死锁,导致多个线程全部挂起,既不能执行,也无法结束,只能靠操作系统强制终止。

小结

  1. 线程的切换速度快,所以在需要大量计算,切换频繁时用线程,还有耗时的操作使用线程可提高应用程序的响应。

  2. Python解释器由于设计时有GIL全局锁,导致了多线程无法利用多核。

  3. 并行操作时使用线程,如C/S架构的服务器端并发线程响应用户的请求。

  4. 需要更稳定安全时,适合选择进程;需要速度时,选择线程更好。

相关阅读


相关推荐
  1. 环江毛南族自治县高级中学
  2. 承德县双峰寺东坎中学
  3. 取皮球
  4. 骆驼和小兔子
  5. 火树银花的成语故事
  6. 昆明市盘龙区虹桥幼儿园(张宫营路) - 昆明市幼儿园黄页
  7. 深圳龙岗实验学校
  8. 脱单!武汉的相亲角在哪你知道吗?
  9. 武汉女子网上做兼职被骗六十五万
  10. 武汉市博物馆一日游
  11. 东莞市道�蛩牧�小学
  12. 老熊和大鼻狗
  13. Python源码剖析 - Python中的字符串对象
  14. 奥迪客户不满加价,被武汉4S店销售群殴
  15. 长泰一中
  16. 南宁市三塘镇那垌小学
  17. 武汉市育才小学二分校
  18. 江西省南昌县莲塘第一中学(莲塘一中)
  19. 辽特第三幼儿园 - 大连幼儿园黄页
  20. 北京市石景山区金树叶艺术幼儿园 - 北京幼儿园黄页
  21. Python公开课 - 多线程使用
  22. 沈阳市辽中县忠华幼儿园 - 沈阳幼儿园黄页
  23. 幼儿园入学准备物品清单
  24. 华中幼儿园 - 哈尔滨幼儿园黄页
  25. 武汉00后大二学妹拍视频月入七十万
  26. 广州市执信南路小学
  27. 上海市青浦区庆华小学
  28. 沈阳市第二十八中学
  29. 石家庄和平西路小学
  30. 辽宁省大连市金州区阳光幼儿园 - 大连幼儿园黄页
  31. 程序自动去除图片水印
  32. 大闹天宫
  33. 易中天给英雄武汉的一首诗 - 武汉新鲜事
  34. 百名网媒总编辑登上知音号欣赏武汉夜色
  35. 遵义市凤冈县花坪镇航星幼儿园 - 遵义市幼儿园黄页
  36. 事发武汉农夫山泉矿泉水内惊现大量虫卵
  37. 国外免费图床 - 好用体验
  38. 上海市浦东新区凌河小学
  39. 长沙市天心区仰天湖小学
  40. 技术破解钉钉打卡考勤 - 苹果手机专用完整解决方案
  41. Python公开课 - 新项目选择Python2还是Python3
  42. 湖北将发放消费券 - 武汉新鲜事
  43. 浙江省文成中学
  44. 涉县西戌镇木井乡中学
  45. 广州市白云区陈田幼儿园 - 广州幼儿园黄页
  46. 莱山区初家中学
  47. Python公开课 - 全文检索模块Whoosh详解(1)
  48. 两个洋娃娃
  49. 卧榻岂容鼾睡
  50. 鬼怪为害
  51. 图像处理工具ImageMagick - 灰度化和二值化
  52. 岩石上的小蝌蚪
  53. 爱奇艺上个人如何发布知识付费视频
  54. 兰州市第十六中学
  55. 武汉一女子七天被骗220万
  56. 广州市惠福西路小学
  57. 南宁市兴宁区童心幼儿园 - 南宁幼儿园黄页
  58. 武汉动物园火烈鸟孔雀排队打疫苗
  59. 上海市奉贤区童乐幼儿园 - 上海幼儿园黄页
  60. 伊川一高
  61. 谜语公主