📜  Python中基于线程的并行性

📅  最后修改于: 2022-05-13 01:54:28.569000             🧑  作者: Mango

Python中基于线程的并行性

多线程程序由子程序组成,每个子程序由不同的线程单独处理。多线程允许程序执行中的并行性。所有活动线程同时运行,有效地共享 CPU 资源,从而使程序执行速度更快。多线程通常用于以下情况:

  1. 有子程序的输出需要由主程序合并。
  2. 主程序包含彼此相对独立的代码段。

多线程程序在同一进程内同时处理不同的任务,其中不同的线程彼此共享数据空间以及主线程。

开始一个新线程

Python中的 threading 模块提供了用于创建新线程的函数调用。 __init__函数用于初始化与新线程关联的数据,而 run函数在线程开始执行时定义线程的行为。

为了创建一个新线程,:

  1. 创建线程类的子类。
  2. 覆盖线程类的 __init__函数。此方法将初始化特定于线程的日期。
  3. 重写 run 方法以定义线程的行为。
# Python program to demonstrate
# initializing a new thread
import threading
  
class thread(threading.Thread):
    def __init__(self, thread_name, thread_ID):
        threading.Thread.__init__(self)
        self.thread_name = thread_name
        self.thread_ID = thread_ID
    def run(self):
        print(str(self.thread_name) +"  "+ str(self.thread_ID));
  
thread1 = thread("GFG", 1000)
thread2 = thread("GeeksforGeeks", 2000);
  
thread1.start()
thread2.start()
  
print("Exit")

输出:

GFG 1000
GeeksforGeeks 2000
Exit

线程模块

Python中的线程模块为线程提供了强大的高级支持。

线程模块定义了以下用于获取线程相关数据的函数调用。所有这些功能都是原子执行的。

  1. active_count():返回当前存活的 Thread 对象的数量。返回的计数等于 enumerate() 返回的列表的长度。
    句法:
    threading.active_count()
  2. current_thread():返回当前的Thread对象,对应调用者的控制线程。如果调用者的控制线程不是通过线程模块创建的,则返回一个功能有限的虚拟线程对象。
    句法:
    threading.current_thread()
  3. get_ident():返回当前线程的“线程标识符”。这是一个非零整数。它的价值没有直接的意义;它旨在作为一种神奇的 cookie,例如用于索引线程特定数据的字典。当一个线程退出并创建另一个线程时,线程标识符可能会被回收。
    句法:
    threading.get_ident()
  4. enumerate():返回当前活动的所有 Thread 对象的列表。该列表包括守护线程、由 current_thread() 创建的虚拟线程对象和主线程。它不包括已终止的线程和尚未启动的线程。
    句法:
    threading.enumerate()
  5. main_thread():返回主线程对象。在正常情况下,主线程是启动Python解释器的线程。
    句法:
    threading.main_thread()
  6. settrace(func):为从线程模块启动的所有线程设置一个跟踪函数。在调用其 run() 方法之前,该函数将传递给每个线程的 sys.settrace()。
    句法:
    threading.settrace(func)
  7. setprofile(func):为从 threading 模块启动的所有线程设置一个 profile函数。在调用其 run() 方法之前,该函数将传递给每个线程的 sys.setprofile()。
    句法:
    threading.setprofile(func)
  8. stack_size([size]):返回创建新线程时使用的线程堆栈大小。
    句法:
    threading.stack_size([size])

该模块还包括常量:

  • TIMEOUT_MAX:阻塞函数(Lock.acquire()、RLock.acquire()、Condition.wait()等)的超时参数允许的最大值。指定大于此值的超时将引发溢出错误。
    句法:
    threading.TIMEOUT_MAX
# Python program to demonstrate
# threading module
import threading
  
def trace_function():
    print("Passing the trace function")
def profile():
    print("Setting the profile of thread: " + str(threading.current_thread().getName()))
  
class thread(threading.Thread):
    def __init__(self, thread_name, thread_ID):
        threading.Thread.__init__(self)
        self.thread_name = thread_name
        self.thread_ID = thread_ID
    def run(self):
        print(str(self.thread_ID));
        print("Number of active threads: "+ str(threading.active_count()))
        print("Name of current thread: " + str(threading.current_thread().getName()))
                                                 
  
  
thread1 = thread("GFG", 1000)
thread2 = thread("GeeksforGeeks", 2000);
print("Name of main thread: " + str(threading.main_thread().getName()))
print("Identity of main thread: "+ str(threading.get_ident()))
print("Stack size = " + str(threading.stack_size()))
print(threading.settrace(trace_function()))
threading.setprofile(profile())
  
  
thread1.start()
thread2.start()
print("Enumeration list: ")
print(threading.enumerate())
print("Exit")

输出:

Name of main thread: MainThread
Identity of main thread: 139964150720320
Stack size = 0
Passing the trace function
None
Setting the profile of thread: MainThread
1000
Number of active threads: 2
Name of current thread: Thread-1
2000
Number of active threads: 2
Name of current thread: Thread-2
Enumeration list: 
[]
Exit

参考:

  • Python文档