美文网首页测试
[Python系列]Python多线程

[Python系列]Python多线程

作者: 测试你个头 | 来源:发表于2017-07-26 00:09 被阅读18次

    背景:说到多线程,我们会想到的是:异步编程、同步(锁)、共享变量、线程池等等,那么Python里面多线程是如何实现的?

    1.新建一个线程

    import threading
    
    // target是线程需要执行的方法,args是线程方法需要传入的参数
    t1 = threading.Thread(target=processservice.biz_monitor_process, args=(src.globals.xspace_im_monitored_process, 5))  
    t1.setDaemon(true) //设置线程为守护线程
    t1.start()
    
    im_page = xspaceimpageservice.XSpaceImPageService()
    
    // 无需传参
    t3 = threading.Thread(target=im_page.biz_servicer_chat)
    t3.start()
    t3.join()
    

    2.线程同步(锁)

    • 线程同步常见的一种实现方式是在竞争资源上添加锁,保证同一时间最多只有一个线程在访问竞争资源
    • Python的threading 模块提供的线程同步对象包括:Lock、RLock、Condition、Event、Semaphore等。

    以Lock为例:

    • 创建锁对象
    mutex = thread.allocate_lock()
    mutex = threading.Lock()
    
    • 加锁
      这里timeout的作用是加锁的超时时间,如果超过超时时间,可以通过返回值判断加锁是否成功
    mutex.acquire([timeout])
    
    • 释放锁
    mutex.release()
    
    • 范例代码:
    // 创建一个lock实例
    mutex = threading.Lock()
    // 加锁
    if mutex.acquire(1):  
                // 线程互斥执行的代码
                num = num+1
                msg = self.name+' set num to '+str(num)
                print msg
                // 释放锁
                mutex.release()
    

    3.线程池
    如果需要使用线程池的话,需要首先安装threadpool包

    pip install threadpool 
    

    范例code

    // 实例一个线程数为poolsize的线程池
    pool = threadpool.ThreadPool(poolsize)  
    
    // makeRequests传入需要线程执行的方法,以及参数,最后的callback非必选,默认为空,创建线程任务
    requests = pool.makeRequests(some_callable, list_of_args, callback)  
    
    // 这里用map函数,将线程任务放到线程池中
    map(pool.putRequest,request_list) 
    
    // wait方法是一个阻塞方法,用于等待线程池中所有线程执行完后返回
    pool.wait() 
    

    相关文章

      网友评论

        本文标题:[Python系列]Python多线程

        本文链接:https://www.haomeiwen.com/subject/wmguqxtx.html