Python中级精华-并发之启动和停止线程

Python014

Python中级精华-并发之启动和停止线程,第1张

为了让代码能够并发执行,向创建线程并在核实的时候销毁它。

由于目的比较单纯,只是讲解基础的线程创建方法,所以可以直接使用threading库中的Thread类来实例化一个线程对象。

例子,用户输入两个数字,并且求其两个数字的四则运算的结果:

除了以上的一些功能以外,在python线程

中没有其他的诸如给线程发信号、设置线程调度属性、执行任何其他高级操作的功能了,如果需要这些功能,就需要手工编写了。

另外,需要注意的是,由于GIL(全局解释器锁)的存在,限制了在python解释器当中只允许运行一个线程。基于这个原因,不停该使用python线程来处理计算密集型的任务,因为在这种任务重我们希望在多个CPU核心上实现并行处理。Python线程更适合于IO处理以及设计阻塞操作的并发执行任务(即等待IO响应或等待数据库取出结果等)。

如何判断线程是否已经启动?

目的:我们加载了一个线程,但是想要知道这个线程什么时候才会开始运行?

方法:

线程的核心特征我认为就是不确定性,因为其什么时候开始运行,什么时候被打断,什么时候恢复执行,这不是程序员能够控制的,而是有系统调度

来完成的。如果遇到像某个线程的运行依托于其他某个线程运行到某个状态时该线程才能开始运行,那么这就是线程同步

问题,同样这个问题非常棘手。要解决这类问题我们要借助threading中的Event对象。

Event其实和条件标记类似,匀速线程

等待某个时间发生。初始状态时事件被设置成0。如果事件没有被设置而线程正在等待该事件,那么线程就会被阻塞,直到事件被设置位置,当有线程设置了这个事件之后,那么就会唤醒正在等待事件的线程,如果线程等待的事件已经设置了,那么线程会继续执行。

一个例子:

如上能够确定的是,主线程会在线程t运行结束时再运行。

4687348.html

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

python3的线程启动支持两种方式:

一种是以传入函数名开启

另一种是通过重写run方法开启

以传入函数名开启:

import time

import threading

def demo(n):

while n >= 0:

print("n:", n)

n -= 1

time.sleep(1)

if __name__=='__main__':

t = threading.Thread(target=demo, args=(10,))

t.start()

t.join()

print("exit")

重写run方法:

import time

import threading

class A(threading.Thread):

def __init__(self, args):

threading.Thread.__init__(self)

self.args = args

def run(self):

n = self.args

while n >0:

print("n:", n)

n -= 1

time.sleep(1)

if __name__=='__main__':

t = A(10)

t.start()

t.join()

print("exit")

创建后台线程:

t = threading.Thread(target=demo, args=(20,), daemon=True)

t.start()

# -*- coding: utf-8 -*-

import threading

import thread

import time

class Test(object):

    def __init__(self):

        # threading.Thread.__init__(self)

        self._sName = "machao"

    def process(self):

        #args是关键字参数,需要加上名字,写成args=(self,)

        th1 = threading.Thread(target=Test.buildList, args=(self,))

        th1.start()

        th1.join()

    def buildList(self):

        while True:

            print "start"

            time.sleep(3)

test = Test()

test.process()

看注释。

如果解决了您的问题请采纳!

如果未解决请继续追问