一、简介
由于python2逐渐不被维护,以及python更优越的性能。后面介绍的python相关知识都是用python3版本写。
这里介绍python3的多线程相关知识,线程的创建使用threading包。
二、简单线程创建
简介线程的创建,先定义执行任务的函数,然后调用threading.Thread(target=say_hello, args=('one',))方法即可,
启动线程使用start()方法,线程等待执行结束使用join()方法。
实例如下:
import threading
# def say_hello(x):
# print("%s say hello" % x)
def main():
# 定义任务处理函数
say_hello = lambda x: print("%s say hello" % x)
# 创建线程,args是传递的参数
thread_1 = threading.Thread(target=say_hello, args=('one',))
# 启动线程
thread_1.start()
# 等待线程执行完成
thread_1.join()
if __name__ == '__main__':
main()
三、创建线程类
创建线程的另一种方式,定义线程类,线程类需继承threading.Thread,
同时定义 __init__方法,用于传递的初始化参数,另外定义run(self)方法,用于线程执行的操作。
实例如下:
import threading
# 创建线程类
class sayHelloThread(threading.Thread):
# 指定线程需要的参数name
def __init__(self, name):
threading.Thread.__init__(self)
self.name = name
# 指定线程运行时的操作
def run(self):
print('%s say hello' % self.name)
def main():
# 创建线程
thread_1 = sayHelloThread('one')
# 启动线程
thread_1.start()
# 等待线程执行完成
thread_1.join()
if __name__
四、线程池创建
创建线程池使用threadpool.ThreadPool(n),n表示线程池内的线程个数。
然后创建线程池要执行的任务,使用makeRequests(callable_, args_list, callback=None,exc_callback=_handle_thread_exception)方法,
包含执行的方法和参数列表。
线程的执行使用putRequest(self, request, block=True, timeout=None)方法。
等待线程池执行结束用wait()方法。
实例如下:
import threadpool
def say_hello(name):
print('%s say hello' % str(name))
def main():
# 创建线程池,指定线程数为4
pool = threadpool.ThreadPool(4)
# 指定任务参数列表,里面一个元素代表着一个任务需要的参数
task_param_list = ['one', 'two', 'three', ['four_1', 'four_2']]
# 创建任务列表
task_list = threadpool.makeRequests(say_hello, task_param_list)
# 任务在线程池中执行
[pool.putRequest(x) for x in task_list]
# 等待任务执行完成
pool.wait()
print("dispose finished")
if __name__ == '__main__':
main()
五、线程锁
这里介绍下用于多线程同步的锁,threading.Lock()用于创建锁,lock.acquire()获取锁,lock.release()释放锁。
实例如下:
import threading
# 创建锁
lock = threading.Lock()
# 创建线程类
class sayHelloThread(threading.Thread):
# 指定线程需要的参数
def __init__(self, name):
threading.Thread.__init__(self)
self.name = name
# 指定线程运行时的操作
def run(self):
# 获取锁
lock.acquire()
print('%s say hello' % self.name)
# 释放锁
lock.release()
def main():
# 创建线程
thread_1 = sayHelloThread('one')
thread_2 = sayHelloThread('two')
# 启动线程
thread_1.start()
thread_2.start()
# 等待线程执行完成
thread_1.join()
thread_2.join()
if __name__ == '__main__':
main()
六、线程安全的队列
另外介绍下线程安全的队列,用queue.Queue()创建,可加参数指定队列的最大个数。
queue.get()用于从队列取数据,queue.put(item)用于向队列放数据。
实例如下:
import threading
from queue import Queue
import time
# 创建线程安全的队列
queue = Queue(3)
# 定义生产者线程类
class producerThread(threading.Thread):
# 指定线程需要的参数
def __init__(self):
threading.Thread.__init__(self)
# 指定线程运行时的操作
def run(self):
index = 1
while True:
index += 1
item = "item" + str(index)
# 生产item放入队列queue中
queue.put(item)
print('%s produce : %s' % (threading.current_thread().getName(), item))
time.sleep(1)
# 定义消费者线程类
class customerThread(threading.Thread):
# 指定线程需要的参数
def __init__(self):
threading.Thread.__init__(self)
# 指定线程运行时的操作
def run(self):
while True:
# 从队列queue中取数据
item = queue.get()
print('%s consumer : %s' % (threading.current_thread().getName(), item))
def main():
# 创建生产者线程
producer = producerThread()
customer = customerThread()
# 启动消费者线程
producer.start()
customer.start()
if __name__ == '__main__':
main()