python多线程和锁

python中,有两个标准模块thread和threading可以实现多线程,不过threading更加高级,推荐使用threading。

threading 模块提供的常用方法:

  • threading.currentThread(): 返回当前的线程变量。

  • threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。

  • threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。

  • threading.setName 设置线程名

  • threading.getName 获得线程名

  • threading.Timer() 定时器,,每隔一段时间就开一一个线程调用一个函数

  • threading.Thread(target=方法名, name='线程名', args=参数)启动一个线程,返回一个进程对象 。

这里以主线程A,子线程B为例:

  • start() 调用B.start()开始执行子线程

  • join() 调用B。join开始执行,同时主线程会在调用的地方等待

  • setDaemon() 主线程A中调用了B.setDaemon(),这个的意思是,把主线程A设置为守护线程, 要是主线程A执行结束了,就不管子线程B是否完成,一并和主线程A退出(和join相反)。必须在start() 方法调用之前设置

threading 模块提供的常量:

threading.TIMEOUT_MAX 设置threading全局超时时间。

线程锁

多线程中,除了线程自己的临时变量, 所有全局或静态变量都由所有线程共享,所以,任何一个变量都可以被任何一个线程修改。
因此,需要引入线程锁给变量上一把锁,当某个线程开始执行时,我们说,该线程因为获得了锁,因此其他线程不能同时执行,只能等待。

balance = 0
lock = threading.Lock()

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

lock.acquire()时,只有一个线程能成功地获取锁,然后继续执行代码,其他线程就继续等待直到获得锁为止才能执行lock.acquire()后的代码。

获得锁的线程用完后一定要释放锁,否则那些苦苦等待锁的线程将永远等待下去,成为死线程。

python中, 线程对多核cpu无效

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

所以,在Python中,可以使用多线程,但不要指望能有效利用多核。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 线程 操作系统线程理论 线程概念的引入背景 进程 之前我们已经了解了操作系统中进程的概念,程序并不能单独运行,只有...
    go以恒阅读 1,703评论 0 6
  • 多进程 要让python程序实现多进程,我们先了解操作系统的相关知识。 Unix、Linux操作系统提供了一个fo...
    蓓蓓的万能男友阅读 641评论 0 1
  • 关于Python多线程的概述 由于GIL的存在,Python的多线程在CPU密集型任务并没有多大的优势,任何Pyt...
    千鸟月读阅读 559评论 0 0
  • 线程和进程 计算机,用于计算的机器。计算机的核心是CPU,在现在多核心的电脑很常见了。为了充分利用cpu核心做计算...
    人世间阅读 24,378评论 3 85
  • 作者|清君策 当你真正明辨是非的时候,也正是你成长的时候。 小黑因为人类的破坏,而失去了生存的地方,不得不跑到人类...
    子清视界阅读 1,023评论 0 7