[1.] threading — Thread-based parallelism
[2.] Python-GIL GlobalInterpreterLock
[2.1] Python中GIL对多线程性能的影响
[3.] 维基百科- GIL全局解释器锁
[4.] Python多进程multiprocessing使用示例
关键词 | 释义 |
---|---|
GIL | 全局解释器锁,用来保证Python解释器某时刻只有一个线程运行;尽管解释器中可以运行多个线程,但是在任意给定时刻只有一个线程会被解释器执行。 |
GIL是语言解释器中的一种机制,用于同步线程,使得任何时候仅有一个线程在执行。 常用的GIL解释器有CPython与Ruby MRI。Python使用的解释器是CPython。
CPython的线程是操作系统的原生线程。在Linux上为pthread,在Windows上为Win thread,完全由操作系统调度线程的执行。一个Python解释器进程内有一个主线程,以及多个用户程序的执行线程。即便使用多核心CPU平台,由于GIL的存在,也将禁止多线程的并行执行。
在Python中,线程启动后,只有执行完才会停止。
Python 3.2开始使用新的GIL。新的GIL实现中用一个固定的超时时间来指示当前的线程放弃全局锁。在当前线程保持这个锁,且其他线程请求这个锁时,当前线程就会在5毫秒后被强制释放该锁。
构造方法:
/*
group: 线程组,目前还没有实现,库引用中提示必须是None;
target: 要执行的方法;
name: 线程名;
args/kwargs: 要传入方法的参数
*/
Thread(group=None, target=None, name=None, args=(), kwargs={})
Python已经使用threading来替代Thread了,传统的Thread功能不太完善,缺少资源的额释放和竞态条件的控制。
#!/usr/bin/env python
from threading import Thread
class MyThread(Thread):
def __init__(self, name, args):
# assign name for parent class's __init__(...)
super(MyThread, self).__init__(name=name)
self.data = args
# rewrite the run() method
def run(self):
print(self.name, self.data)
if __name__ == '__main__':
thread = MyThread("Henry's Tel is ", '007')
thread.start()
#!/usr/bin/env python
from threading import *
class MyThread():
def __init__(self):
pass
def run(self, name, data):
print str(name)+str(data)
def start(self):
try:
thread_list = []
thread = Thread(
target=self.run,
args=(
"Henry",
" is threading()!\n"))
thread_list.append(thread)
for thread in thread_list:
thread.start()
print thread.isAlive()
thread.join()
print thread.isAlive()
except():
print "Err: "+self.__func__
return False
if __name__ == '__main__':
module = MyThread()
module.start()
Henry is threading()!
True
False
unifished at here
进程实例不能放在类中定义
#!/usr/bin/env python
import multiprocessing
def main_process():
name = multiprocessing.current_process().name
print(name, "start...")
print(name, "end")
def sub_process():
name = multiprocessing.current_process().name
print(name, "start...")
print(name, "end")
if __name__ == '__main__':
process_list = []
process_list.append(multiprocessing.Process(name="process(service)", target=main_process))
process_list.append(multiprocessing.Process(name="process(client)", target=sub_process))
for process in process_list:
process.start()
for process in process_list:
process.join()