Python中基于线程的并行性
多线程程序由子程序组成,每个子程序由不同的线程单独处理。多线程允许程序执行中的并行性。所有活动线程同时运行,有效地共享 CPU 资源,从而使程序执行速度更快。多线程通常用于以下情况:
- 有子程序的输出需要由主程序合并。
- 主程序包含彼此相对独立的代码段。
多线程程序在同一进程内同时处理不同的任务,其中不同的线程彼此共享数据空间以及主线程。
开始一个新线程
Python中的 threading 模块提供了用于创建新线程的函数调用。 __init__函数用于初始化与新线程关联的数据,而 run函数在线程开始执行时定义线程的行为。
为了创建一个新线程,:
- 创建线程类的子类。
- 覆盖线程类的 __init__函数。此方法将初始化特定于线程的日期。
- 重写 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中的线程模块为线程提供了强大的高级支持。
线程模块定义了以下用于获取线程相关数据的函数调用。所有这些功能都是原子执行的。
- active_count():返回当前存活的 Thread 对象的数量。返回的计数等于 enumerate() 返回的列表的长度。
句法:threading.active_count()
- current_thread():返回当前的Thread对象,对应调用者的控制线程。如果调用者的控制线程不是通过线程模块创建的,则返回一个功能有限的虚拟线程对象。
句法:threading.current_thread()
- get_ident():返回当前线程的“线程标识符”。这是一个非零整数。它的价值没有直接的意义;它旨在作为一种神奇的 cookie,例如用于索引线程特定数据的字典。当一个线程退出并创建另一个线程时,线程标识符可能会被回收。
句法:threading.get_ident()
- enumerate():返回当前活动的所有 Thread 对象的列表。该列表包括守护线程、由 current_thread() 创建的虚拟线程对象和主线程。它不包括已终止的线程和尚未启动的线程。
句法:threading.enumerate()
- main_thread():返回主线程对象。在正常情况下,主线程是启动Python解释器的线程。
句法:threading.main_thread()
- settrace(func):为从线程模块启动的所有线程设置一个跟踪函数。在调用其 run() 方法之前,该函数将传递给每个线程的 sys.settrace()。
句法:threading.settrace(func)
- setprofile(func):为从 threading 模块启动的所有线程设置一个 profile函数。在调用其 run() 方法之前,该函数将传递给每个线程的 sys.setprofile()。
句法:threading.setprofile(func)
- 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文档