线程和进程
1、线程共享创建它的进程的地址空间,进程有自己的地址空间
2、线程可以访问进程所有的数据,线程可以相互访问
3、线程之间的数据是独立的
4、子进程复制线程的数据
5、子进程启动后是独立的 ,父进程只能杀掉子进程,而不能进行数据交换
6、修改线程中的数据,都是会影响其他的线程,而对于进程的更改,不会影响子进程
threading.Thread
Thread 是threading模块中最重要的类之一,可以使用它来创建线程。有两种方式来创建线程:一种是通过继承Thread类,重写它的run方法;另一种是创建一个threading.Thread对象,在它的初始化函数(__init__)中将可调用对象作为参数传入。
先来看看通过继承threading.Thread类来创建线程的例子:
import threadingimport timeclass MyThread(threading.Thread): def __init__(self, arg): # super(MyThread, self).__init__() # 新式类继承原有方法写法 threading.Thread.__init__(self) self.arg = arg def run(self): time.sleep(2) print(self.arg)for i in range(10): thread = MyThread(i) print(thread.name) thread.start()
另外一种创建线程的方法:
import threadingimport timedef process(arg): time.sleep(2) print(arg)for i in range(10): t = threading.Thread(target=process, args=(i,)) print(t.name) t.start()
Thread类还定义了以下常用方法与属性:
Thread.getName() 获取线程名称
Thread.setName() 设置线程名称
Thread.name 线程名称
Thread.ident 获取线程的标识符。线程标识符是一个非零整数,只有在调用了start()方法之后该属性才有效,否则它只返回None
判断线程是否是激活的(alive)。从调用start()方法启动线程,到run()方法执行完毕或遇到未处理异常而中断 这段时间内,线程是激活的
Thread.is_alive()
Thread.isAlive()
Thread.join([timeout]) 调用Thread.join将会使主调线程堵塞,直到被调用线程运行结束或超时。参数timeout是一个数值类型,表示超时时间,如果未提供该参数,那么主调线程将一直堵塞到被调线程结束
Python GIL(Global Interpreter Lock)
GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念。就好比C++是一套语言(语法)标准,但是可以用不同的编译器来编译成可执行代码。有名的编译器例如GCC,INTEL C++,Visual C++等。Python也一样,同样一段代码可以通过CPython,PyPy,Psyco等不同的Python执行环境来执行。像其中的JPython就没有GIL。然而因为CPython是大部分环境下默认的Python执行环境。所以在很多人的概念里CPython就是Python,也就想当然的把GIL归结为Python语言的缺陷。所以这里要先明确一点:GIL并不是Python的特性,Python完全可以不依赖于GIL。
新闻热点
疑难解答