多线程学习 第一天

多线程

多线程 vs 多进程

  • 程序:一堆代码以文本形式存入一个文档

  • 进程: 程序运行的一个状态

    • 包含地址空间,内存,数据栈等
    • 每个进程由自己完全独立的运行环境,多进程共享数据是一个问题
  • 线程

    • 一个进程的独立运行片段,一个进程可以由多个线程
    • 轻量化的进程
    • 一个进程的多个现成间共享数据和上下文运行环境
    • 共享互斥问题
  • 全局解释器锁(GIL)

  • python代码由虚拟机进行控制

  • 在主循环中只能由一个控制线程在执行

  • python包

    • thread : 有问题,不好用py3改成了_thread
    • threading : 通行的包
    • 案例01:
      -顺序执行 耗时比较长
    • 案例02:
      -使用多线程,耗时变短。使用_thread
    • 案例03:
      -多线程, 传参数
  • threading的使用

    • 直接利用threading.Thread生成thread实例
      1. t = threading.thread(target=xxx,arg=(xxx,))
      2. t.start():启动多线程
      3. t.join(): 等待多线程支线完成
      4. 案例04
      5. 案例05 放入join 和04 做比较
        • 05中全部结束时间就成了垫底
      • 守护线程 -damon
        • 如果在程序中将子线程设置成守护线程,则子线程会在主线结束时自动退出
        • 一般认为,守护线程不重要或者不能离开主线
        • 守护线程案例是否有效果与环境相关
        • 案例06:非守护线程
        • 案例07:守护线程

    线程主要属性 :

     - threading.currentThread:返回当前线程变量
     - threading.enumerate:返回一个包含正在运行的线程的list,正在运行的线程指的是线程启动后,结束前的状态
     - threading.activeCount: 返回正在运行的线程数量,效果跟 len(threading.enumerate)相同
     - thr.setName: 给线程设置名字
     - thr.getName: 得到线程的名字
     - 线程属性案例08:
    
  • 直接继承来自thread.Thread
    - 直接继承Thread
    - 重写run函数
    - 类实例可以直接运行
    - 案例09
    - 案例10, 工业风案例
    - loop = [4,2]

class ThreadFunc:

def __init__(self, name):
    self.name = name

def loop(self, nloop, nsec):
    '''
    :param nloop: loop函数的名称
    :param nsec: 系统休眠时间
    :return:
    '''
    print('Start loop ', nloop, 'at ', ctime())
    sleep(nsec)
    print('Done loop ', nloop, ' at ', ctime())

def main():
print("Starting at: ", ctime())

# ThreadFunc("loop").loop 跟一下两个式子相等:
# t = ThreadFunc("loop")
# t.loop
# 以下t1 和  t2的定义方式相等
t = ThreadFunc("loop")
t1 = threading.Thread( target = t.loop, args=("LOOP1", 4))
# 下面这种写法更西方人,工业化一点
t2 = threading.Thread( target = ThreadFunc('loop').loop, args=("LOOP2", 2))

# 常见错误写法
#t1 = threading.Thread(target=ThreadFunc('loop').loop(100,4))
#t2 = threading.Thread(target=ThreadFunc('loop').loop(100,2))

t1.start()
t2.start()

t1.join( )
t2.join()


print("ALL done at: ", ctime())

if name == ‘main’:
main()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值