欢迎访问宙启技术站
智能推送

Python多线程编程函数:threading、multiprocessing等

发布时间:2023-06-11 13:10:49

Python是一种高级动态编程语言,它有很多特点,其中之一就是可以使用多线程来实现并发编程。并发编程允许程序同时执行多个不同的任务,而不是依次执行每个任务。

在Python中,我们可以使用多种方式来实现多线程编程。最常见的方法是使用内置的threading模块和multiprocessing模块。这些模块中提供了许多函数和类,可以方便地创建和管理线程,以及协调多个线程之间的交互。

1. threading模块

使用Python内置的threading模块,我们可以方便地创建和管理多线程。这个模块提供了Thread类,可以让您轻松创建一个新线程。Thread类的实例化需要传递两个参数:一个是函数,另一个是函数的参数。例如:

import threading

def my_function(argument):
     print(argument)

my_thread = threading.Thread(target=my_function, args=("Hello World!",))
my_thread.start()

上面的代码将会创建一个新线程,这个线程将会调用my_function函数,并且打印出"Hello World!"。

除了Thread类之外,threading模块还提供了很多其他有用的函数。例如,可以使用Lock类来保护共享资源的使用,在线程之间协调共享资源的访问。以下是一个简单的例子:

import threading

shared_resource = 0
lock = threading.Lock()

def increment_resource():
     global shared_resource
     lock.acquire()
     shared_resource += 1
     lock.release()

thread1 = threading.Thread(target=increment_resource)
thread2 = threading.Thread(target=increment_resource)

thread1.start()
thread2.start()

thread1.join()
thread2.join()

print(shared_resource)

在上面的代码中,我们创建了两个线程,每个线程都会调用increment_resource函数。但是,由于共享资源shared_resource可能会被同时修改,所以我们使用Lock类来保护对它的访问。首先,我们获得了锁,然后对共享资源进行修改,最后释放锁。这样就保证了在任何时候只有一个线程可以访问该资源。

2. multiprocessing模块

在一些情况下,多线程并不总是最佳的选择。例如,当需要执行CPU密集型任务时,多线程可以降低总体性能,因为Python的全局解释器锁(GIL)会限制在任何时刻只有一个线程可以执行Python代码。在这种情况下,我们可以使用multiprocessing模块。

multiprocessing模块提供了一个Process类,这个类和Thread类很相似。以下是一个简单的例子:

import multiprocessing

def calculate_square(number):
     result = number * number
     print(result)

if __name__ == '__main__':
     process = multiprocessing.Process(target=calculate_square, args=(10,))
     process.start()

在上面的代码中,我们创建了一个新的进程,该进程将调用calculate_square函数,并传递参数10。在调用start方法之后,该进程将会执行calculate_square函数,并打印结果100。

与多线程不同,在多进程模式中,每个进程都拥有自己的Python解释器,因此可以并行地执行Python代码,从而提高整体性能。

总结

Python给予了我们很多工具去进行多线程或者多进程开发,这些工具在不同的场合都有不同的用武之地。threading模块比较适用于处理IO密集型任务,而multiprocessing模块则可以用于处理CPU密集型任务。无论使用哪种模块,都要小心使用共享资源,并且协调不同线程或进程之间的交互。