并发编程基础专项测试
考察知识点
- 多线程基础:threading模块、Thread类、线程创建与启动
- 线程同步:Lock、RLock、Semaphore、线程安全
- GIL机制:全局解释器锁原理、影响、规避方法
- 线程通信:Queue、Event、Condition
queue.Queue是线程安全的队列,多个线程可以安全地同时进行put()和get()操作,无需额外加锁。
ProcessPoolExecutor与ThreadPoolExecutor用法相似,但使用进程而非线程,适合CPU密集型任务,可以真正并行执行。
multiprocessing模块用于创建和管理进程,每个进程有独立的Python解释器和内存空间,可以绕过GIL实现真正的并行执行。
GIL(Global Interpreter Lock)是Python解释器的机制,它确保同一时刻只有一个线程执行Python字节码,这限制了多线程在CPU密集型任务中的并行能力。
线程锁Lock用于防止多个线程同时访问共享资源,acquire()获取锁,release()释放锁,确保同一时刻只有一个线程可以执行被保护的代码段。
Python的threading模块提供了创建和管理线程的功能,使用Thread类可以创建新线程,调用start()方法启动线程。
ThreadPoolExecutor是concurrent.futures模块提供的线程池,可以高效管理多个线程,自动分配任务,比手动创建线程更高效。
关于RLock(可重入锁)和Lock的区别,以下说法正确的是:
执行q.get()时,如果队列为空,会发生什么?
ThreadPoolExecutor的submit()和map()方法的区别是:
关于Thread的start()和run()方法,以下说法正确的是:
GIL对以下哪种任务的影响最大?
multiprocessing中,哪种方式可以实现进程间的数据共享?
以下代码执行后,可能的输出顺序是?
import threading
def task():
print('线程')
t = threading.Thread(target=task)
t.start()
print('主线程')
Queue是____________的队列,内部自动处理____________。put()放入元素,队列满时____________。get()取出元素,队列空时阻塞。get_nowait()不阻塞取出,空时抛Empty异常。maxsize参数限制队列最大容量。
Lock用于互斥访问,____________()获取锁,____________()释放锁,推荐使用____________语句自动管理。RLock是可重入锁,同一线程可多次获取。Semaphore是信号量,控制同时访问资源的线程数量上限。
ThreadPoolExecutor创建线程池,____________指定最大线程数。____________()提交单个任务,返回____________对象,调用result()获取结果。map()批量提交任务,直接返回结果迭代器。使用with语句自动关闭线程池。
GIL确保同一时刻只有____________线程执行Python字节码。GIL对____________型任务影响最大,对____________型任务影响较小(I/O时会释放GIL)。规避GIL的方法:使用multiprocessing(多进程)、使用C扩展、使用asyncio异步编程。
创建线程使用threading.____________类,传入____________参数指定执行函数,使用____________传递参数。调用start()方法启动线程,调用join()方法等待线程结束。使用current_thread()获取当前线程对象。
multiprocessing.Process创建进程,使用____________()启动,____________()等待。进程间通信使用____________(队列)、Pipe(管道)、Manager(共享对象)。进程有独立内存空间,可以绕过GIL实现真正并行。