基础概念
http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html(较好解释)
进程 : 程序的动态执行,是程序的进口和出口,进程是资源分配的最小单位,进程由自己的独立内存空间、数据栈等,不同进程只能使用进程间通信,而不能直接共享信息。
线程 :是CPU调度的最小单位,一个进程中的各个线程之间共享同一块数据空间。
互斥锁 : 防止多个线程同时读写某一块内存区域,进程的某一块内存区域,只允许一个线程占有,当被某一个线程占有,就锁上;
线程有开始、顺序执行和结束3部分,有一个自己的指令指针,记录运行到什么地方。线程的运行可能被抢占(中断)或暂时被挂起(睡眠),从而让其他线程运行,这叫作让步。
线程一般是并发执行的。正是由于这种并行和数据共享的机制,使得多个任务的合作变得可能。实际上,在单CPU系统中,真正的并发并不可能,每个线程会被安排成每次只运行一小会儿,然后就把CPU让出来,让其他线程运行。
- 对于操作系统来说,一个任务就是一个进程,开启多个任务就是多进程。
有些进程不止可以同时做一件事,比如Word可以同时打字、检查拼写、打印等。在一个进程内部,要同时做多件事,就需要同时运行多个线程。(进程中的多线程)
线程在执行过程中与进程还是有区别的。每个独立线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能独立执行,必须依存在进程中,由进程提供多个线程执行控制。
多线程的执行方式和多进程是一样的,也是由操作系统在多个线程之间快速切换,让每个线程都短暂交替运行,看起来就像同时执行一样。当然,真正同时执行多线程需要多核CPU才能实现。
同时执行多个任务的方法:
- 多个进程可以一起执行多个任务
- 启动一个进程,在一个进程内启动多个线程,这样多个线程也可以一起执行多个任务。
- 启动多个进程,每个进程再启动多个线程,这样同时执行的任务就更多了,不过这种模型过于复杂,实际很少采用。
总而言之,多线程是多个相互关联的线程的组合,多进程是多个互相独立的进程的组合。线程是最小的执行单元,进程至少由一个线程组成。
如何选择并发编程模式
小概念
![O%`(VZ)0_9_QP%IXL8@ZJ9.png
需要大量的读取硬盘->io ; 大量的计算->cpu
全局解释器锁
![QU7X_0L~GCT@DDF0_]J(~QR.png](/uploads/projects/u12001300@oruz3w/daed2a440702f0670f22d6c9d80d0bb1.png)

(requests库不支持多协程)<br />

import threading #引入线程模块threading.Thread(target=eud_url.requests_edu,args=(url,)#target->函数名!只是函数名,不是调用函数()没有括号, args=元组,函数的参数变量只有一个的情况下(变量,)要有,thread.start()thread.join()#线程之间的执行顺序是无序的;多线程中join()的用法https://www.cnblogs.com/cnkai/p/7504980.html
多线程爬虫
import requestsurls =[f"https://src.sjtu.edu.cn/list/?page={page}"for page in range(1,21)]#print(urls)def requests_edu(url):r=requests.get(url=url,verify=None)print(url,len(r.text))#requests_edu(urls[0])import threadingimport timeimport eud_urldef single_thread():print("single_thread begin:")for url in eud_url.urls:eud_url.requests_edu(url)def multi_thread():print("multi_thread begin:")threads = []for url in eud_url.urls:threads.append(threading.Thread(target=eud_url.requests_edu,args=(url,)))for thread in threads:thread.start()for thread in threads:thread.join()if __name__ == '__main__':start=time.time()single_thread()end=time.time()print("singel thread cost: %s"%(end-start))start=time.time()multi_thread()end=time.time()print("multi thread cost: %s"%(end-start))



