并发和并行
并发:当有多个线程操作时,如果系统只有一个CPU,则它不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分为若干个时间段,再将时间段分配给各个线程执行,在一个时间段的线程代码运行时,其它代码处于挂起状态。这种方式我们称之为并发(concurrent)
并行:当系统有一个以上CPU时,则线程的操作有可能非并发。当一个CPU执行一个线程时,另一个CPU可以执行另外一个线程,两个线程互补抢占CPU资源,可以同时进行,这种方式我们称之为并行(parallel)
实现多任务的方式:
多进程模式
多线程模式
协程
进程》线程》协程
#进程:Process 计算密集型
#线程:Thread 耗时操作时使用,爬虫
#状态:新建,就绪,运行,阻塞,结束
# 线程是可以共享全局变量的
# GIL 全局解释器锁
import threading
money=1000
ticket=1000
'''
线程是可以共享全局变量的
GIL 全局解释器锁
'''
def run1():global ticketfor i in range(100):ticket-=1def run2():global moneyfor i in range(100):money-=1
if __name__=="__main__":th1=threading.Thread(target=run1,name='th1')th2=threading.Thread(target=run1,name='th2')th3=threading.Thread(target=run1,name='th3')th4=threading.Thread(target=run1,name='th4')th5=threading.Thread(target=run2,name='th5')th1.start()th2.start()th3.start()th4.start()th5.start()th1.join()th2.join()th3.join()th4.join()th5.join()print('money:',money)print('ticket:',ticket)
import threading
n=0
def task1():global nfor i in range(10000000000):n+=1print('----->task1中的值是:',n)def task2():global nfor i in range(10000000000):n+=1print('----->task2中值是:',n)if __name__ == '__main__':th1=threading.Thread(target=task1,name='task1')th2=threading.Thread(target=task2,name='task2')th1.start()th2.start()th1.join()th2.join()print('n最后值是:',n)