zoukankan      html  css  js  c++  java
  • python 多线程

    进程是由若干线程组成,一个进程至少有一个线程

    多线程

    Python的标准库提供了两个模块:_thread和threading;threading是高级模块,对_thread进行了封装


    启动一个线程就是把一个函数传入并创建Thread实例,然后调用start()开始执行

    import time, threading

    # 新线程执行的代码:
    def loop():
    print('thread %s is running...' % threading.current_thread().name)
    n = 0
    while n < 5:
    n = n + 1
    print('thread %s >>> %s' % (threading.current_thread().name, n))
    time.sleep(1)
    print('thread %s ended.' % threading.current_thread().name)

    print('thread %s is running...' % threading.current_thread().name)
    t = threading.Thread(target=loop, name='LoopThread')
    t.start()
    t.join()
    print('thread %s ended.' % threading.current_thread().name)

    执行结果:

    thread MainThread is running...
    thread LoopThread is running...
    thread LoopThread >>> 1
    thread LoopThread >>> 2
    thread LoopThread >>> 3
    thread LoopThread >>> 4
    thread LoopThread >>> 5
    thread LoopThread ended.
    thread MainThread ended.

    任何进程 默认会启动一个线程,
    我们把该线程称为主线程,

    主线程又可以启动新的线程,

    Python的threading模块有个current_thread()函数,它永远返回当前线程的实例。主线程实例的名字叫MainThread,子线程的名字在创建时指定,用LoopThread命名子线程。
    名字仅仅在打印时用来显示,完全没有其他意义,如果不起名字Python就自动给线程命名为Thread-1,Thread-2……


    Lock

     

    多进程中,同一个变量,各自有一份拷贝存在于每个进程中,互不影响,

    多线程中,所有变量都由所有线程共享,任何一个变量都可以被任何一个线程修改

    确保一个线程在修改balance的时候,别的线程一定不能改

    该线程获得了锁,其他线程不能同时执行,只能等待,直到锁被释放后,获得该锁以后才能改
    创建一个锁就是通过threading.Lock()来实现

    balance = 0
    lock = threading.Lock()

    def run_thread(n):
    for i in range(100000):
    # 先要获取锁:
    lock.acquire()
    try:
    change_it(n)
    finally:
    # 改完了一定要释放锁:
    lock.release()

    用try...finally来确保锁一定会被释放
    =======================================
    import time, threading

    # 假定这是你的银行存款:
    balance = 0

    def change_it(n):
    # 先存后取,结果应该为0:
    global balance
    balance = balance + n
    balance = balance - n

    def run_thread(n):
    for i in range(100000):
    change_it(n)

    t1 = threading.Thread(target=run_thread, args=(5,))
    t2 = threading.Thread(target=run_thread, args=(8,))
    t1.start()
    t2.start()
    t1.join()
    t2.join()
    print(balance)


    ========================================

    Python的线程虽然是真正的线程,但解释器执行代码时,有一个GIL锁:Global Interpreter Lock,任何Python线程执行前,必须先获得GIL锁,然后,每执行100条字节码,解释器就自动释放GIL锁,让别的线程有机会执行。这个GIL全局锁实际上把所有线程的执行代码都给上了锁,所以,多线程在Python中只能交替执行,即使100个线程跑在100核CPU上,也只能用到1个核。

     

    朝闻道
  • 相关阅读:
    vue2 生命周期
    javascript http库axios
    vue2自定义事件之$emit
    php配置rewrite模块
    php 正则匹配中文(转)
    php常用自定义函数
    Mysql----MySQL的mysql_insert_id和LAST_INSERT_ID(转)
    Mysql----mysql启动服务时提示"服务名无效"
    div+css布局
    php常见问题以及解决方法
  • 原文地址:https://www.cnblogs.com/wander-clouds/p/8477327.html
Copyright © 2011-2022 走看看