在了解多线程前先给你们介绍下并发和并行:python
并发:多个任务一块儿执行 在多任务之间快速切换处理 任务数量大于cpu核数多线程
并行:一个cpu核处理一个任务,多个cpu核同时处理多个任务 任务数量等于或者小于cpu核数 并发
再介绍下同步和异步 :异步
同步:指线程在访问某一资源时,得到了资源的返回结果以后才会执行其余操做(先作某件事,再作某件事) url
异步: 与同步相对,是指线程在访问某一资源时,不管是否取得返回结果,都进行下一步操做;当有了资源返回结果时 系统自会通知线程spa
在Python中,使用threading库来建立多线程线程
import threading def func1(): for i in range(6): time.sleep(1) def func2(): for i in range(5): time.sleep(1) # 建立线程对象 t2 = threading.Thread(target=func2) # target = 方法名 t1 = threading.Thread(target=func1, name='线程1') # 能够设置线程名字 # start 启动线程活动 # join([time]) 设置主线程会等待time秒后再往下执行,time默认为子线程结束,多个子线程之间设置的值会增长 # isAlive 返回线程是否活动的 # getName() 返回线程名 # setName() 设置线程名 a = time.time() t2.start() # 开始执行线程2 t1.start() # 开始执行线程1 # 让主线程等待子线程执行完后再继续往下执行 同步的概念 t2.join() t1.join() b = time.time() c = b - a print(c) threading.currentThread() # 返回当前执行的线程 threading.enumerate() # 返回正在运行的全部线程(list) 正在运行指:启动后、结束前,不包括了启动前和终止后的线程 threading.activeCount() # 返回正在运行的线程数量
在threading库中调用start方法后,start方法调用了他内部的run()方法,咱们能够经过继承threading重写run()方法来批量建立线程,代码以下code
import threading import requests import time # 经过继承 threading 类来建立线程 重写run方法 由于start方法调用的就是run 重写run class MyClass(threading.Thread): def __init__(self, url): self.url = url super().__init__() # 若是要传入参数重写init方法时,必定要调用父类的init方法 # 发送requests请求 def run(self): res = requests.get(self.url) print('线程{},返回{}'.format(threading.current_thread(), res.status_code)) t1 = time.time() for i in range(5): t = MyClass('https://www.baidu.com') t.start() t.join() t2 = time.time() print(t2 - t1)
能够经过直接实例化类来建立线程对象,若是要传入参数,在重写init方法时要注意在最后调用父类的init方法,具体缘由能够去查看thrreading库是如何实现的,在init方法中有不少其余的代码须要执行。orm
多线程共享全局变量:对象
在python中是使用单核来处理线程的,也就是并发并不是并行,代码示例以下:
import threading a = 100 def func1(): for i in range(100000): global a a += 1 print(a) def func2(): for i in range(100000): global a a += 1 print(a) t1 = threading.Thread(func1()) t2 = threading.Thread(func2()) t1.start() t2.start()
当执行func1()方法时,获取全局变量为100,此时暂停切换到func2()方法,获取全局变量a为100,并进入for循环,当a循环到20000时(举例),又切换到func1()方法中开始执行for循环,此时在func1()中a的值为100,循环1次后把a的值又更新为101,形成数据不许确。
解决这个问题会用到互斥锁、同步、队列,在下一篇会给你们讲到