【Python-随笔】 Python创建多线程

Python创建多线程-随笔

Python创建多线程的三种方法

  • _thread模块函数式创建线程
  • threading模块函数式创建线程
  • 继承threading类创建线程

_thread模块函数式创建线程

【说明】

  • 调用_thread模块中的start_new_thread()函数来产生新线程;

【函数】

_thread.start_new_thread ( function, args[, kwargs] )

《参数说明》

  • function:线程函数。
  • args:传递给线程函数的参数,必须是个tuple类型。
  • kwargs:可选参数。

【示例】

《代码01》

# -*- coding:utf-8 -*-
import _thread
import time


def a(p):
    for i in range(5):
        print(p)
        time.sleep(0.5)


def b(p):
    for i in range(5):
        print(p)
        time.sleep(0.2)


if __name__ == '__main__':
    _thread.start_new_thread(a, ('我是线程A',))
    _thread.start_new_thread(b, ('我是线程B',))
    while True:
        pass

《结果01》

我是线程A
我是线程B
我是线程B
我是线程B
我是线程A
我是线程B
我是线程B
我是线程A
我是线程A
我是线程A

Process finished with exit code -1

threading模块函数式创建线程

【说明】

  • 创建线程时,传入一个函数,用于线程执行,比起通过类继承创建多线程,函数式创建线程有更好的灵活性。

【示例】

《代码01》

# encoding:utf-8
import threading
import time
import random


def run(sec):
    time.sleep(sec)
    print('当前线程的名字是: ', threading.current_thread().name)


if __name__ == '__main__':
    print('这是主线程:', threading.current_thread().name)
    thread_list = []
    '''创建多个线程'''
    for i in range(5):
        t = threading.Thread(target=run, args=(random.random(),))
        thread_list.append(t)
    # 循环这5个线程,调用相应的run方法
    for t in thread_list:
        t.start()

《结果01》

这是主线程: MainThread
当前线程的名字是:  Thread-2 (run)
当前线程的名字是:  Thread-4 (run)
当前线程的名字是:  Thread-3 (run)
当前线程的名字是:  Thread-5 (run)
当前线程的名字是:  Thread-1 (run)

Process finished with exit code 0

继承threading类创建线程

【说明】

  • 继承线程类threading.thread,再重载成员函数run,程序处理的代码写在函数run中,最后再调用start()方法来运行线程

【示例】

《代码01》

# -*- coding:utf-8 -*-
import threading
import time


class A(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)

    def run(self):
        for i in range(5):
            print('我是线程A', threading.current_thread().getName())
            time.sleep(0.5)


class B(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)

    def run(self):
        for i in range(5):
            print('我是线程B', threading.current_thread().name)
            time.sleep(0.2)


t1 = A()
t1.start()
t2 = B()
t2.start()

《结果01》

我是线程A Thread-1
我是线程B Thread-2
D:\MY_APP\Project\PythonProject\DuoXianCheng\deom.py:18: DeprecationWarning: getName() is deprecated, get the name attribute instead
  print('我是线程A', threading.current_thread().getName())
我是线程B Thread-2
我是线程B Thread-2
我是线程A Thread-1
我是线程B Thread-2
我是线程B Thread-2
我是线程A Thread-1
我是线程A Thread-1
我是线程A Thread-1

Process finished with exit code 0

《注释01》

  • 获得当前线程的名称:threading.current_thread().getName()
  • 获得当前线程的名称:threading.current_thread().name

关于threadingthread的使用总结:

threading 模块

  1. threading是对thread模块的再封装
  2. threading模块支持守护线程
  3. threading.Thread(target,args)创建线程,但没有启动线程
  4. start()开启线程
  5. join()挂起线程
  6. 当主线程执行完退出时,默认重要的子线程完成后再退出

thread模块

  1. _thread.start_new_thread()方法不仅创建了线程而且启动了线程
  2. 当主线程执行完退出时,其他的线程都会无警告,无保存的死亡

补充说明

  • 暂时没有时间做细致的探究和说明,有时间再写;

你可能感兴趣的:(python,linux,开发语言)