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