Python 主要提供了包括thread、threading、Queue等多线程编程模块。thread 模块提供了基本的线程和锁的支持,而threading提供了更高级别、功能更强的线程管理的功能。Queue模块允许用户创建一个可以用于多个线程之间共享数据的队列数据结构。
threading模块相对于thread模块对线程的支持更完善,除非是需要访问线程的底层结构,否则建议直接使用threading模块。
threading模块主要使用Thead类来创建线程,主要用以下三种使用方式:
函数来构造Thread类实例可调用的类对象来构造Thread类实例# !/usr/bin/env python
import threading
from time import sleep
def loop(nloop, nsec):
sleep(nsec)
def main():
for i in xrange(5):
t = threading.Thread(target=loop, args=(i, i))
t.start()
# !/usr/bin/env python
import threading
from time import sleep
def loop(nloop, nsec):
sleep(nsec)
def ThreadFunc(object):
def __init__(self, func, args, name=''):
self.name = name
self.func = func
self.args = args
def __call__(self):
apply(self.func, self.args)
def main():
for i in xrange(5):
t = threading.Thread(target=ThreadFunc(loop, (i, i), loop.__name__))
t.start()
# !/usr/bin/env python
import threading
from time import sleep
def MyThread(threading.Thread):
def __init__(self, func, args, name=''):
self.name = name
self.func = func
self.args = args
def run(self):
apply(self.func, self.args)
def main():
for i in xrange(5):
t = MyThread(loop, (i, i), loop.__name__)
t.start()
Python 代码的执行由Python虚拟机(也叫解释器主循环)来控制。为了解决多线程之间数据完整性和状态同步的问题,设计为在任意时刻只有一个线程在解释器中运行。对Python虚拟机的访问由全局解释器锁(GIL, global interpreter lock)来控制,正是这个锁能保证同一时刻只有一个线程执行。
即Python中的多线程是表面多线程,也可以理解为fake多线程,不是真正的多线程。
Python中,如果想利用计算机的多核提高程序执行效率,用多进程代替多线程, 也可以考虑把核心部分也成C模块,或者索性用其他语言实现。
python实现多进程的模块最常用的是multiprocessing、concurrent.futures,此外还有multiprocess、pathos、pp、parallel、pprocess等模块。本文主要介绍multiprocessing的使用方式。
multiprocessing支持子进程、通信和共享数据、执行不同形式的同步,提供了Process、Queue、Pipe、Lock等组件。这里我们只是介绍一下Process组件.