zoukankan      html  css  js  c++  java
  • python多线程学习记录

    1.多线程的创建

    import threading

    t = t.theading.Thread(target, args……)

    t.SetDeamon(True)//设置为守护进程

    t.start(),启动线程

    t.join(),阻塞当前线程,即使得在当前线程结束时,不会退出。会等到子线程结束之后才退出。

    如果不加join语句,主线程不会等到子线程结束才结束,但却不会立即杀死该线程。

    但是如果添加了SetDaemon(True),如果不加join,则会在主线程结束后马上杀死子线程。

    如果join()加上时间,则会在一段时间之后再退出。

    2.线程锁和Threadocal

    (1)线程锁

    多线程最大特点是线程之间可以共享数据,那么就会出现多线程之间同时改变一个变量,而出现死锁、数据错乱等情况。

    比如,有一个global a, global b 有俩线程th1,th2,在某一时刻发生这样的情况:

    th1拥有a,但是需要访问b;而th2拥有b,却需要访问a。

    这时候th1,th2都互不相让,最后他们俩都饿死掉了。这就是死锁。

    针对上述问题,出现了Lock,当访问某个资源之前先用Lock.acquire()锁住资源,访问之后再Lock.release()释放掉资源。

    (2)TheadLocal

    当不想将变量共享给其他线程时,可以使用局部变量,但是在函数中定义的局部变量使得在函数之间传递特别麻烦,TheadLocal就是特别的牛逼,了不起。

    他解决了全局变量需要加锁,局部变量传递麻烦的两个问题。

    local_school = theading.local()

    定义一个Theadocal对象,此时local_school是一个全局变量,但是这个全局变量之能够在该线程中为全局变量,在其他线程看来他就是一个局部变量,别的线程不可更改之。

    local_school = theading.local()

    def process_thread(name):#绑定ThreadLocal的student

      local_school.student =  name

    这个只有本线程可以修改,别的线程不可以。

    ThreadLocal可以理解为一个dict,可以绑定不同的变量。

    ThreadLocal使用最多的地方是每一个线程处理一个HTTP请求,在Flask框架中就是这个原理,它使用的是基于Werkzeug的LocalStack。

    3.Map实现多线程

    urls = ['www.google.com','www.luoxiaofeng.com', 'www.stackoverfolw.com']

    results = map(urllib2.urlopen, urls)

    map将每个元素当作参数分别传给urllib2.urlopen函数,并最后把结果放到results列表中。map一手包办了序列操作、参数传递和结果保存等一系列的操作。

    其原理是将ruls中的每一个链接交给不同的cpu。map函数负责将线程分给不同的cpu。

    在python中有两个库包含了map函数:mutilprocessing和它的子库multiprocessing.dummy。dummy是一个multiprocessing模块的完整克隆,唯一不同的是multiprocessing作用与进程,而dummy模块作用雨线程。

    pool = ThreadPool()#创建县城池

    results = pool.map(urllib2.urlopen, urls)#将不同的url传给各自的线程,并把执行结果返回到results中。

    print results

    pool.close()

    pool.join()

    4.Python多线程的缺陷:

    不是真正多线程,因为有一个GIL,全局解释锁,该锁的存在保证在同一时间只有一个线程在真正执行任务,也就是多线程不是真正并发,只是交替的执行。假如有10个线程在10个cpu上,当前工作也只能是一个cpu上的线程。

    5.应用场景:

    适合在IO密集型任务中。因为I/O密集型执行期间大部分时间是用在I/O上,如数据库I/O,较少时间用在CPU计算上。因此,此场景可以使用python多线程,当一个任务阻塞在IO操作上时,我们可以立即切换执行其他线程上的其他IO操作请求。

  • 相关阅读:
    字符串哈希
    codeforces#766 D. Mahmoud and a Dictionary (并查集)
    莫比乌斯反演模板
    马拉车模板
    codeforces#580 D. Kefa and Dishes(状压dp)
    1076E
    448C
    543A
    295B
    poj3974 Palindrome
  • 原文地址:https://www.cnblogs.com/hackerl/p/6031612.html
Copyright © 2011-2022 走看看