8.Python线程Thread & multiprocessing

参考

[1.] threading — Thread-based parallelism

[2.] Python-GIL GlobalInterpreterLock

[2.1] Python中GIL对多线程性能的影响

[3.] 维基百科- GIL全局解释器锁

[4.] Python多进程multiprocessing使用示例

一、线程并行概述

关键词 释义
GIL 全局解释器锁,用来保证Python解释器某时刻只有一个线程运行;尽管解释器中可以运行多个线程,但是在任意给定时刻只有一个线程会被解释器执行。

1. GIL (Global Interpreter Lock)

GIL是语言解释器中的一种机制,用于同步线程,使得任何时候仅有一个线程在执行。 常用的GIL解释器有CPython与Ruby MRI。Python使用的解释器是CPython。

CPython的线程是操作系统的原生线程。在Linux上为pthread,在Windows上为Win thread,完全由操作系统调度线程的执行。一个Python解释器进程内有一个主线程,以及多个用户程序的执行线程。即便使用多核心CPU平台,由于GIL的存在,也将禁止多线程的并行执行。

在Python中,线程启动后,只有执行完才会停止。

Python 3.2开始使用新的GIL。新的GIL实现中用一个固定的超时时间来指示当前的线程放弃全局锁。在当前线程保持这个锁,且其他线程请求这个锁时,当前线程就会在5毫秒后被强制释放该锁。

2. 解决GIC对线程的并行限制问题 — 创建独立的进程

  • Python 2.6引入多进程包 multiprocessing;
  • 将关键组件用C/C++编写为Python扩展,通过ctypes使Python程序直接调用C语言编译的动态链接库的导出函数。

二、关于Thread类

构造方法:

/*
    group: 线程组,目前还没有实现,库引用中提示必须是None; 
  target: 要执行的方法; 
  name: 线程名; 
  args/kwargs: 要传入方法的参数
*/

Thread(group=None, target=None, name=None, args=(), kwargs={}) 

1. 使用Thread

_0. Thread 和 threading的比较

Python已经使用threading来替代Thread了,传统的Thread功能不太完善,缺少资源的额释放和竞态条件的控制。

_1.使用方式
  • a.以类的方式,继承、创建线程
  • b.将要执行的方法作为参数传给Thread的构造方法
_2.使用示例
ex01_thread.py
#!/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()
ex02_thread.py
#!/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()

执行: python ex02_thread.py,结果:
Henry is threading()!
True

False

三、关于multiprocessing

unifished at here

1. 使用multiprocessing

注意:

进程实例不能放在类中定义

#!/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()

你可能感兴趣的:(Python,Python,Thread,multiprocessing,threading)