zoukankan      html  css  js  c++  java
  • python 线程(thread)

    #coding:utf-8
    #多线程
    #Python的标准库提供了两个模块:thread和threading,thread是低级模块,threading是高级模块,对thread进行了封装
    #绝大数情况下,我们只需要使用threading这个高级模块
    #启动一个线程就是把一个函数传入并创建Thread实例,然后调用start()开始执行

    import time,threading

    def loop():

    print 'thread %s is runing...' % 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

    #创建一个线程对象,参数1为函数名字,参数name为线程名字
    t = threading.Thread(target = loop,name = 'LoopThread')

    #启动线程
    t.start()

    #阻塞主线程等待LoopThread线程执行完毕
    t.join()

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

    多线程中的锁

    #coding:utf-8
    #多线程和多进程的不同在于,多进程中,同一个变量,各自有一份拷贝存在于每个进程中,互不影响,而多线程中,所有变量都由所有线程共享
    #所以,任何一个变量都可以被任何一个线程修改,因此,线程之间共享数据最大的危险在于多个线程同时修改一个变量
    #我们定义了一个共享变量balance,初始值为0,并且启动两个线程,先存后取,理论上结果应该为0,但是,由于
    #线程的调度是由操作系统决定的t1,t2交替执行时,只要循环次数足够多,balance的结果就不一定是0了
    import threading,time

    balance = 0

    #获取一个锁对象
    lock = threading.Lock()

    def change_it(n):

    global balance

    balance = balance + n

    balance = balance - n



    def run_thread(n):

    for i in range(100000):

    #获得锁
    lock.acquire()

    try:

    change_it(n)

    finally:

    #改完了一定要释放锁
    lock.release()

    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


    #如果我们要确保balance计算正确, 就要给change_its上一把锁,当某个线程开始执行change_it()时,我们
    #说该线程获得了锁,因此其他线程不能同时执行change_it()只能等待,直到锁被释放后,获得该锁以后才能改
    #由于锁只有一个,无论多少线程,同一时刻最多只有一个线程持有该锁,所以不会造成修改的冲突。创建一个锁
    #就是通过threding.Lock()来实现

    ThreadLocal

    #coding:utf-8
    #在多线程环境下,每个线程都有自己的数据。一个线程使用自己的局部变量比使用全局变量好,
    #因为局部变量只有线程自己能看见,不会影响其他线程,而全局变量的修改必须加锁。
    #但是局部变量也有问题,就是在函数调用的时候,传递起来很麻烦
    #ThreadLocal应运而生
    import threading

    #创建全局ThreadLocal对象
    local_school = threading.local()

    def process_student():

    print 'Hello %s (in %s)' % (local_school.student,threading.current_thread().name)



    def process_thread(name):

    #绑定ThreadLocal的student
    local_school.student = name
    process_student()


    #创建线程对象1
    t1 = threading.Thread(target = process_thread, args =('paulversion',),name = 'Thread-A')
    #创建线程对象2
    t2 = threading.Thread(target = process_thread,args =('Floki',),name = 'Thread-B')

    t1.start()

    t2.start()

    t1.join()

    t2.join()

    #全局变量local_school 就是一个ThreadLocal对象,每个Thread对它都可以读取student属性,单互不影响,你可以把local_shool看成全局变量
    #但每个属性如local_school.student都是线程的局部变量,可以任意读写而互不干扰,也不用管理锁的问题,ThreadLocal内部 会处理
    #可以理解为全局变量local_school是一个dict,不但可以用local_school.student,还可以绑定其他变量,如local_school.teacher等等
    #Threadlocal最常用的地方就是为每个线程绑定一个数据库连接

  • 相关阅读:
    博客
    NFS服务配置
    LAMP环境搭建与配置
    Linux系统管理技巧(下)
    Linux系统管理技巧(上)
    LVM
    安装RPM包或源码包
    Linux第四章 文件和目录管理
    MySQL主从配置 : 配置主和从(一) 配置主
    MySQL主从配置:主从介绍
  • 原文地址:https://www.cnblogs.com/paulversion/p/8310362.html
Copyright © 2011-2022 走看看