Python中的多线程MultiThread

多线程相关概念

进程:程序的一次执行,每个进程都有自己的地址空间、内存、数据栈以及其他辅助数据。进程之间内存空间、数据栈都是相互独立的,只能使用进程间通讯(IPC)共享信息。

pid:唯一标识符来标识进程,使用kill杀死进程 kill pid

线程:所有的线程运行在一个进程中,共享相同的运行环境。

主线程:创造一个进程的时候,会创造一个线程,这个线程被称为主线程,一个进程里只有一个主线程。

多线程的目的是并行运行相互独立的子任务,提升整个任务的效率
最简单的例子:

    import threading
        def test():
            print 1
    a = threading.Thread(target = test)  #生成一个线程
    a.start()  #启动线程

Python全局锁机制(GIL)

Python代码的执行由Python虚拟机来控制,对Python虚拟机的访问由全局解释锁Global Interpreter Lock来控制。
在任意一个指定的时间,有且只有一个线程在运行—->python是线程安全的。
在调用外部代码时,GIL也会被锁定,直到这个函数结束为止。
Python里的多线程,不是真正意义上的多线程。(丢手绢式)

    import threading
    import time
    def test(p):
        time.sleep(0.001)           #time.sleep(float)   程序会被挂起指定时间。
        print p
    ts = []
    for i in xrange(0,15):        #迭代线程
        th = threading.Thread(target=test,args=[i])
        th.start()
        ts.append(th)
    for i in ts:
        i.join()
    print "hoho,end!!!!!"

多线程可以大大降低程序运行时间,但python中多线程复杂度高,不建议使用!

    import time
    import threading
    def a():
        print 'a begin'
        time.sleep(2)
        print 'a end'

    def b():
        print 'b begin'
        time.sleep(2)
        print 'b end'

    b_time = time.time()
    a()
    b()
    print time.time() - b_time      #代码完成时间 (4s左右)

    b_time = time.time()
    _a = threading.Thread(target=a)
    _b = threading.Thread(target=b)
    _a.start()
    _b.start()
    _a.join()
    _b.join()
    print time.time() - b_time      #代码完成时间 (2s左右)

io操作中的多线程

必须要lock,防止并行冲突。
互斥锁
加锁 acquire 释放锁 release
加锁操作完后一定要释放,否则会变成死锁

    import threading
    mlock = threading.Lock()     #mlock = threading.RLock() 可重入锁,用法一样,防止死锁。
    num = 0
    def a():
        global num
        mlock.acquire()               #加锁
        num += 1                      #你要执行的代码,需要独占资源,比如文件的读写。
        mlock.release()               #释放锁
        print num

    for i in xrange(0,10):
        d = threading.Thread(target=a)
        d.start()

你可能感兴趣的:(python学习)