多线程与线程池的使用

线程
python的thread模块是比较底层的模块,python的threading模块是对thread做了一些包装的,可以更加方便的被使用,使用模块 import threading
要知道:
线程执行是无顺序的,
线程资源是共享的
线程是cpu执行的基本单元
线程可以实现多任务,多用来处理I/O密集型任务

threading.Thread参数介绍
target:线程执行的函数
name:线程名称
args:执行函数中需要传递的参数,元组类型
kwargs:传参数(字典)
另外:注意daemon参数
如果某个子线程的daemon属性为False,主线程结束时会检测该子线程是否结束,如果该子线程还在运行,则主线程会等待它完成后再退出;
如果某个子线程的daemon属性为True,主线程运行结束时不对这个子线程进行检查而直接退出,同时所有daemon值为True的子线程将随主线程一起结束,而不论是否运行完成。
属性daemon的值默认为False,如果需要修改,必须在调用start()方法启动线程之前进行设置

线程的方法:
start()方法 开启线程
join()方法 线程阻塞
daemon = False(后台线程,主线程结束不影响子线程运行)
daemon = True(前台线程,主线程结束子线程随之结束)

因为线程的资源是共享的,为了保护资源就要用到
保护资源,threading.Lock() 添加了线程锁之后,保证同一时刻只能有一个线程在使用或修改资源

互斥锁(重点)
当多个线程几乎同时修改某一个共享数据的时候,需要进行同步控制
线程同步能够保证多个线程安全访问竞争资源,最简单的同步机制是引入互斥锁
threading模块中定义了Lock类,可以方便的处理锁定:

# 创建锁
mutex = threading.Lock()

# 锁定
mutex.acquire()

# 释放
mutex.release()

注意:
如果这个锁之前是没有上锁的,那么acquire不会堵塞

如果在调用acquire对这个锁上锁之前 它已经被 其他线程上了锁,那么此时acquire会堵塞,直到这个锁被解锁为止

线程池
要使用线程池我们需要导入模块包 from concurrent.futures import ThreadPoolExecutor
创建一个线程池 pool = ThreadPoolExecutor(max_workers=8)

我们在往线程池提交任务的时候 有几个参数需要知道
**"""
fn(要执行的任务), *args(要传递的参数), kwargs(要传递的参数)
“”"
result = pool.submit(crawlPageDate,url,name=‘1808’)

#submit: 表示将我们需要执行的任务给这个线程池,

给线程添加后调方法(add_done_callback添加的是方法名),作用是:当我们某个任务执行完毕之后,就会回调你设置的回调函数
result.add_done_callback(done)

代码说明:

#创建一个线程池
			pool = ThreadPoolExecutor(10)
			#如何提交任务给线程池呢?
			
			#网线程池中添加任务
			for pagenum in range(50):
			#submit: 表示将我们需要执行的任务给这个线程池,
			handler = pool.submit(get_page_data,pagenum)
			#给线程池设置任务之后,可以设置一个回调函数,
			#作用是:当我们某个任务执行完毕之后,就会回调你设置的回调函数
			handler.add_done_callback(done)
			pool.shutdown(wait=True)

你可能感兴趣的:(大神,多线程,线程池)