python thread快速调用

Posted 帅气的黑桃J

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python thread快速调用相关的知识,希望对你有一定的参考价值。

快速上手

线程的创建有两种,一种是函数绑定式,一种是类名调用式,下面分别介绍两种开发方式。

函数绑定式

调用threading.Thread(target=test)从而让绑定test函数,在执行start()后就会创建一个新的线程去执行绑定的test函数,具体操作如下。

  • threading.current_thread().name可以查看当前线程的名称
  • threading.activeCount()可以查看当前的线程数

示例

import threading
import time

def test():
    for i in range(5):
        print('[info] p1 now is :p2'.format(p1=threading.current_thread().name,p2=i))
        # time.sleep(1)


def method():
    for i in range(5):
        print('[info] p1 now is :p2'.format(p1=threading.current_thread().name,p2=i))
        time.sleep(1)


def thread_1():
    thread = threading.Thread(target=test)
    thread.start()

def thread_2():
    thread = threading.Thread(target=method)
    thread.start()



if __name__ == '__main__':
    thread_1()
    thread_2()
    print('[info] count='+str(threading.activeCount())+'!!!')

Thread的生命周期

  1. 创建对象时,代表 Thread 内部被初始化。
  2. 调用 start() 方法后,thread 会开始运行。
  3. thread 代码正常运行结束或者是遇到异常,线程会终止。

类名调用式

可以自定义一个类,然后继承Thread类,重写run()方法,run()方法里面就是这个线程要执行的内容,然后和函数绑定式一样,通过start()开启线程。

  • 示例
import threading
import time


class TestThread(threading.Thread):

    def __init__(self,name=None):
        threading.Thread.__init__(self,name=name)

    def run(self):
        for i in range(5):
            print(threading.current_thread().name + ' test ', i)
            time.sleep(1)


thread = TestThread(name='TestThread')
thread.start()


for i in range(5):
    print(threading.current_thread().name+' main ', i)
    print(thread.name+' is alive ', thread.isAlive())
    time.sleep(1)

其他属性

线程阻塞

join()提供线程阻塞手段,简单来说,就是可以规定线程什么时候该运行,延迟多久运行,哪个线程先运行、哪个后运行。

注意:在线程阻塞期间只有当前join指定的线程可以运行,其他的线程(如主线程)都将停止运行,等到join指定的线程满足释放条件之后才会更变为多线程状态,如实例所示。

  • join形参
def join(self, timeout=None):

如果不加参数则意味着需要等到线程结束之后才会开始执行

示例:

import threading
import time

def test():

    for i in range(5):
        print(threading.current_thread().name+' test ',i)
        time.sleep(0.5)


thread = threading.Thread(target=test,name='TestThread')
thread.start()
thread.join(1.0)#延迟一秒后运行

for i in range(5):
    print(threading.current_thread().name+' main ', i)
    print(thread.name+' is alive ', thread.isAlive())
    time.sleep(1)

daemon

在默认情况下,如果另外开了一个线程,这个时候主线程先结束了但是次线程还没有结束的话,主线程就会等待次线程,等到它结束了之后在进行。

如果次线程中daemon 属性默认是 False,这使得 MainThread 需要等待它的结束,自身才结束。

  • 示例
import threading
import time

def test():

    for i in range(5):
        print(threading.current_thread().name+' test ',i)
        time.sleep(0.5)


thread = threading.Thread(target=test,name='TestThread',daemon=True)
thread.start()
thread.join(1.0)#延迟一秒后运行

for i in range(5):
    print(threading.current_thread().name+' main ', i)
    print(thread.name+' is alive ', thread.isAlive())
    time.sleep(1)

参考资料

Python多线程编程(一):threading 模块 Thread 类的用法详解

以上是关于python thread快速调用的主要内容,如果未能解决你的问题,请参考以下文章

python threading超线程使用简单范例的代码

vs2003:快速片段工具

python jupyter快速运行片段

NDK: ant 错误 [javah] Exception in thread "main" java.lang.NullPointerException 多种解决办法(代码片段

在 Python 多处理进程中运行较慢的 OpenCV 代码片段

python使用上下文对代码片段进行计时,非装饰器