豪翔天下

Python多进程和多线程

多线程和多进程能极大限度的利用线代计算机强大的CPU,在IO密集型的应用场景里十分常见,目前项目中有个需求,是需要向别人网站发送请求等待响应,不过必须等页面
的js执行完毕后才能获取内容,就得将执行时间设置得长一点,比如10s,如果每个请求都等这么久那效率实在太慢,所以趁此机会,学习了一下Python的多进程和多
线程编程。

在Python里面多进程和多线程的区别

  • Python里的多线程只能利用CPU的一个核(由于全局解释锁的历史原因),而多进程则能利用多核的优势
  • 多线程一般来说比多进程快,毕竟共享内存,但是多线程也更危险,因为一个线程崩溃可能导致整个程序崩溃

Python多线程

  • 定义与使用
    import threading

class Thread(threading.Thread):
    def __init__(self, 变量):
        threading.Thread.__init__(self)
        self.变量 = 变量
    def run(self):
        逻辑
thread = Thread(参数) # 定义一个线程
thread.start()        # 开启一个线程
  • 全局变量:加锁,对于全局变量,如果仅仅是引用其值,而不对其进行修改,那么可以直接引用,如果要进行修改,就必须加锁,否则会出现不可预期的错误,比如可能会导致MySQL连接意外断开
    LOCK = threading.Lock()  # 在全局定义一个锁
# 局部使用
LOCK.acquire()
修改全局变量
LOCK.release()
  • 局部变量:虽然局部变量简单的使用直接用就行,但是如果要在run里面进行各个函数之间的传递那就麻烦了,所以提供了ThreadLocal来将线程内部的局部变量变为一个字典,其它函数直接调用即可
    LOCAL = threading.local() # 在全局定义,每个线程引用该值结果都仅仅会得到自己的私有变量
# 在Thread类里面的run函数赋值,不能在__init__里面定义,因为那时候线程还没启起来
LOCAL.变量名 = 值 # 就这样
  • 常用方法
    threading.activeCount()  # 获取当前线程数量,我一般用这个来控制线程最大的数量
threading.currentThread() # 获取当前线程对象
threading.currentThread().getName() # 获取当前线程的名称
exit()         # 终止当前线程,网上好多人问怎么没有API,后来发现exit就行了...并不会影响到其它线程和主线程

Python多进程

waiting…

haofly wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!
坚持原创技术分享,您的支持将鼓励我继续创作!