python中实现多线程的方式



python中实现多线程的方式
1、通过直接实现Thread对象的方式
thread = Thread(target=(),args=(a,..))
2、通过继承Thread,自己通过子类创建对象的方式
class subThread(Thread):
def run():
pass
thread = subThread(target=func1,args=(ag1,ag2..))
thread.start()


多线程,有可以共享全局变量的优点,但是也会造成由于各个线程对统一资源的访问致使资源被破坏,就是数据不同步了
对于这样的现象,就可以通过加互斥锁的方式来提高操作的互斥性,保持数据的完整性不被破坏


互斥锁的方式:
from threading import Lock
#创建锁
mutex = Lock()
#锁定
mutex.acquire(blocking=True, timeout=-1) 这里的参数可以设置blocking为阻塞,默认为True,就是只有等到获得锁后
才会继续执行下一步,timeout为设置延时时间,超过时间就跳过这一步
设置此参数可以方式死锁情况的出现
#释放
mutex.release()
只有释放锁资源后该锁才能继续被下一个线程acquire()


threadlocal:
import threading


# 创建全局ThreadLocal对象:
local_school = threading.local()
全局变量local_school就是一个ThreadLocal对象,每个Thread对它都可以读写student属性,但互不影响。你可以把local_school看成全局变量,但每个属性如local_school.student都是线程的局部变量,可以任意读写而互不干扰,也不用管理锁的问题,ThreadLocal内部会处理。
可以理解为全局变量local_school是一个dict,不但可以用local_school.student,还可以绑定其他变量,如local_school.teacher等等。ThreadLocal最常用的地方就是为每个线程绑定一个数据库连接,HTTP请求,用户身份信息等,这样一个线程的所有调用到的处理函数都可以非常方便地访问这些资源。






KeyPoint:
其实对于python的多线程,是伪多线程,假如用单核执行一个死循环,会使cpu占满。假如 用双核双线程执行两个死循环则现象是
两个核都只占用了一半的占用率 对于这样的现象,无疑是极大的降低了运行效率,这是因为python线程中GIL(全局解释器锁)的存在
GIL的作用就是即使当前有多线程要执行,但是GIL这个参数会一次只让一个线程给cpu处理,当该线程处理完后才会继续放入
下一个线程,这也就解释了 前面单核占满而双核只占用一般cpu使用率的原因
解决方法有 使用多进程就不会出现该问题
或者多线程部分通过C语言来解决

猜你喜欢

转载自blog.csdn.net/yizhuanlu9607/article/details/78145849
今日推荐