多线程在python中作用不大 GIL的原因
添加线程
本节我们来学习threading模块的一些基本操作,如获取线程数,添加线程等。首先别忘了导入模块:
import threading
获取已激活的线程数
threading.active_count()# 2
查看所有线程信息
threading.enumerate()# [<_MainThread(MainThread, started 140736011932608)>, <Thread(SockThread, started daemon 123145376751616)>]
输出的结果是一个<_MainThread(...)>带多个``。
查看现在正在运行的线程
threading.current_thread()# <_MainThread(MainThread, started 140736011932608)>
添加线程,threading.Thread()接收参数target代表这个线程要完成的任务,需自行定义
def thread_job():print('This is a thread of %s' % threading.current_thread())def main():thread = threading.Thread(target=thread_job,) # 定义线程thread.start() # 让线程开始工作if __name__ == '__main__':main()
join()
加入thread.join()之后会等待这一步进行完才进行下一步
储存进程结果 Queue
import threadingimport timefrom queue import Queuedef job(l,q):for i in range (len(l)):l[i] = l[i]**2q.put(l)def multithreading():q =Queue()threads = []data = [[1,2,3],[3,4,5],[4,4,4],[5,5,5]]for i in range(4):t = threading.Thread(target=job,args=(data[i],q))t.start()threads.append(t)for thread in threads:thread.join()results = []for _ in range(4):results.append(q.get())print(results)if __name___=='__main__':multithreading()
使用 Lock 的情况
lock在不同线程使用同一共享内存时,能够确保线程之间互不影响,使用lock的方法是, 在每个线程执行运算修改共享内存之前,执行lock.acquire()将共享内存上锁, 确保当前线程执行时,内存不会被其他线程访问,执行运算完毕后,使用lock.release()将锁打开, 保证其他的线程可以使用该共享内存。
