[Python系列]Python多线程

背景:说到多线程,我们会想到的是:异步编程、同步(锁)、共享变量、线程池等等,那么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多线程)