Python基础-多线程

多线程

多任务可以由多进程完成,也可以由一个进程内的多线程完成。
我们前面提到了进程是由若干线程组成的,一个进程至少有一个线程。
由于线程是操作系统直接支持的执行单元,因此,高级语言通常都内置多线程的支持,Python也不例外,并且,Python的线程是真正的Posix Thread,而不是模拟出来的线程。
Python的标准库提供了两个模块:_thread和threading,_thread是低级模块,threading是高级模块,对_thread进行了封装。绝大多数情况下,我们只需要使用threading这个高级模块。
启动一个线程就是把一个函数传入并创建Thread实例,然后调用start()开始执行:

import time, threading, random

#线程执行代码
def loop(msg):
    print(msg)
    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(random.random() * 1)

    print('thread %s is ended' % threading.current_thread().name)


if __name__=='__main__':

    print('thread %s is running...' % threading.current_thread().name)

    #线程执行的代码块   参数   线程名称
    t = threading.Thread(target=loop, args=('test',), name='loopthread')
    t.start()   #开启线程
    t.join()    #等待线程结束
    print('thread %s is ended' % threading.current_thread().name)

#打印结果
thread MainThread is running...
test
thread loopthread is running...
thread loopthread >> 1 
thread loopthread >> 2 
thread loopthread >> 3 
thread loopthread >> 4 
thread loopthread >> 5 
thread loopthread is ended
thread MainThread is ended

由于任何进程默认就会启动一个线程,我们把该线程称为主线程,主线程又可以启动新的线程,Python的threading模块有个current_thread()函数,它永远返回当前线程的实例。主线程实例的名字叫MainThread,子线程的名字在创建时指定,我们用loopthread命名子线程。名字仅仅在打印时用来显示,完全没有其他意义,如果不起名字Python就自动给线程命名为Thread-1,Thread-2……

线程锁

线程锁是为了解决多线程情况下的资源读写的问题。

resources
lock = threading.Lock()

def run_thread():
    # 先要获取锁
    lock.acquire()
    try:
        # 修改资源等操作
        change_it(resources)
    finally:
        # 释放锁
        lock.release()

当多个线程同时执行lock.acquire()时,只有一个线程能成功地获取锁,然后继续执行代码,其他线程就继续等待直到获得锁为止。
获得锁的线程用完后一定要释放锁,否则那些苦苦等待锁的线程将永远等待下去,成为死线程。所以我们用try…finally来确保锁一定会被释放。

python的GIL

这里有一个博客很不错,强烈推荐看一下:
http://python.jobbole.com/81822/
说白了还是python的多线程还是有很多限制,就算是多进程也不能很好地解决很多问题。

总结

多线程编程,模型复杂,容易发生冲突,必须用锁加以隔离,同时,又要小心死锁的发生。
Python解释器由于设计时有GIL全局锁,导致了多线程无法利用多核。多线程的并发在Python中就是一个美丽的梦(目前是这样)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值