Python和多线程

Python和多线程

不,这不是个好主意。Python不支持多线程,因为有一个叫做全局解释器锁(GIL)的东西。多线程是不可能的。多线程程序包含两个或更多的部分,可以同时运行且每个部分可以处理不同的任务,从而充分利用可用资源,尤其是当你的计算机有多个CPU时。多线程使你能够以一种方式编写程序,多个活动可以同时进行。

Python不支持多线程,但是如果你想要以等待IO之类的方式运行程序,那么它被大量使用。相反,线程包不能让你使用额外的CPU核心。Python不支持多线程,因为Cpython解释器上的Python不支持通过多线程进行真正的多核执行。但是,Python确实有一个线程库。

GIL并不妨碍线程。GIL只是确保一次只有一个线程在执行Python代码;控制仍然在线程之间切换。但是,如果混合使用C扩展和I / O(如PIL或numpy操作),任何C代码都可以与一个活动的Python线程并行运行。

线程模块

我们仍然可以使用线程模块进行多线程操作。进程内的多个线程共享与主线程相同的数据空间,因此比起独立进程,它们可以更轻松地共享信息或进行通信。

Python 2.4中附带的较新的线程模块相比前一节中讨论的thread模块提供了更强大、更高级的线程支持。

线程模块暴露了thread模块的所有方法,并提供了一些附加方法:

  • threading.activeCount() - 返回活动的线程对象数量。

  • threading.currentThread() - 返回调用者线程控制中的线程对象数。

  • threading.enumerate() - 返回当前活动的所有线程对象的列表。

线程模块具有Thread类,它实现了线程操作。Thread类提供的方法如下:

  • run() - run()方法是线程的入口点。

  • start() - start()方法通过调用run方法启动线程。

  • join([time]) - join()等待线程终止。

  • isAlive() - isAlive()方法检查线程是否仍在执行。

  • getName() - getName()方法返回线程的名称。

  • setName() - setName()方法设置线程的名称。

示例

Python提供的线程模块包含了一个简单易用的锁机制,可以让你同步线程。通过调用Lock()方法创建一个新的锁。

新锁对象的acquire(blocking)方法用于强制线程同步运行。可选的blocking参数允许你控制线程是否等待获得锁。

若blocking设置为0,如果无法获得锁,则线程立即返回0;若获得锁,则返回1。若blocking设置为1,线程则会阻塞,并等待锁释放。

新锁对象的release()方法用于在不再需要锁时释放锁。

import threading
import time

class myThread (threading.Thread):
    def __init__(self, threadID, name, counter):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.name = name
        self.counter = counter
    def run(self):
        print ("Starting " + self.name)
        # Get lock to synchronize threads
        threadLock.acquire()
        print_time(self.name, self.counter, 3)
        # Free lock to release next thread
        threadLock.release()

def print_time(threadName, delay, counter):
    while counter:
        time.sleep(delay)
        print ("%s: %s" % (threadName, time.ctime(time.time())))
        counter -= 1

threadLock = threading.Lock()
threads = []

# Create new threads
thread1 = myThread(1, "Thread-1", 1)
thread2 = myThread(2, "Thread-2", 2)

# Start new Threads
thread1.start()
thread2.start()

# Add threads to thread list
threads.append(thread1)
threads.append(thread2)

# Wait for all threads to complete
for t in threads:
    t.join()
print ("Exiting Main Thread")

输出

Starting Thread-1
Starting Thread-2
Thread-1: Fri Aug 12 05:49:52 2022
Thread-1: Fri Aug 12 05:49:53 2022
Thread-1: Fri Aug 12 05:49:54 2022
Thread-2: Fri Aug 12 05:49:56 2022
Thread-2: Fri Aug 12 05:49:58 2022
Thread-2: Fri Aug 12 05:50:00 2022
Exiting Main Thread

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程