博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python 线程
阅读量:7037 次
发布时间:2019-06-28

本文共 2406 字,大约阅读时间需要 8 分钟。

线程

线程简介

  • 在一个进程中,若想做多个子任务,我们把这些子任务称为线程。

  • 线程可以理解为轻量级的进程。

  • 进程之间的数据是独立的,而一个进程下的线程数据是共享的。

  • 线程是CPU分配时间的最小单位。进程和线程的调度都是操作系统的事。

  • 一个进程默认都有一个线程,我们称为主线程。

线程模块

  • _thread:低级模块

  • threading:高级模块,是对_thread的封装

  • 以后建议大家使用高级模块threading

线程模块_thread

  • 示例:

    import _threadimport time​def loop():    print('子线程开始')    print('子线程结束')    if __name__ == '__main__':      print('主线程开始')    # 创建线程    _thread.start_new_thread(loop, ())    # 主线程结束,子线程立即结束,通过演示测试    time.sleep(3)    print('主线程结束')

非常简陋,不建议使用

线程模块threading

  • 基本使用

    import threadingimport time​def run(num):    c = threading.current_thread()    print('子线程开始', c.name)    time.sleep(3)    print(num)    # print(threading.active_count())​    print('子线程结束', c.name)    if __name__ == '__main__':    # 获取主线程    t = threading.main_thread()    print('主线程开始:', t.name)    # 获取当前线程    # c = threading.current_thread()    # print('当前线程:', c.name)​    # 创建子线程    sub = threading.Thread(target=run, args=(250,), name='下载美女图片')​    # 启动子线程    sub.start()​    # 活跃线程个数    # print(threading.active_count())    # 线程列表    # print(threading.enumerate())​    time.sleep(1)    # 判断线程是否是活着的    print(sub.is_alive())    # 等待子线程    sub.join()​    print(sub.is_alive())​    print('主线程结束:', t.name)

数据共享

  • 示例:全局变量可以共享

     
    import threading​# 全局变量num = 250​def thread_one():    global num    num += 10​def thread_two():    global num    num -= 100  ​if __name__ == '__main__':    print('主线程:', num)    t1 = threading.Thread(target=thread_one)    t1.start()    t1.join()    print('主线程:', num)    t2 = threading.Thread(target=thread_two)    t2.start()    t2.join()    print('主线程:', num)

    线程之间共享进程的所有数据

  • 示例:多线程操作同一变量,可能会出错,代码见04-gongxiang.py

  • 示例:加锁解决数据错乱问题(线程锁)

  • import threading​  # 这是你银行的存款  money = 250​  def run(n):      global money​      for i in range(100000):          '''          lock.acquire()          try:              # 运算之后,数据应该不变              money = money + n              money = money - n          finally:              lock.release()          '''          # 简化书写          with lock:              money = money + n              money = money - n​  if __name__ == '__main__':      lock = threading.Lock()      # while True:      t1 = threading.Thread(target=run, args=(10,))      t2 = threading.Thread(target=run, args=(15,))      t1.start()      t2.start()      t1.join()      t2.join()​          # if money != 250:          #     break​      print(money)

转载于:https://www.cnblogs.com/kiki5881/p/8610536.html

你可能感兴趣的文章
Fedora下安装ORACLE 11g
查看>>
了解SSL必须要懂得密码技术
查看>>
nodejs项目进程管理器之pm2
查看>>
【chrome插件】web版微信接入图灵机器人API实现自动回复
查看>>
二十六、oracle pl/sql 分页
查看>>
很不错的前端页面
查看>>
Currency 货币 filter
查看>>
微信小程序中用户唯一ID的获取
查看>>
Tomcat6,7,8的日志切割
查看>>
mysql 启动错误-server PID file could not be found
查看>>
seleium_元素定位
查看>>
在VS2008中调用Matlab的m文件
查看>>
读Xamarin文档记录
查看>>
Mysql Commands
查看>>
[转载]关于eclipse提示:"The superclass "javax.servlet.http.HttpServlet" was not found on the
查看>>
MOSS网站集的迁移
查看>>
1255 字典序最小的子序列(贪心)
查看>>
嵌入式软件测试工具―Winams
查看>>
express+websocket+exec+spawn=webshell
查看>>
打杂程序员之nginx服务配置
查看>>