#Author:'haijing'
#date:2018/11/18
# 只有操作系统(os)才可以去调动cpu、硬盘等
# 以前写的每一个.py文件就是一个进程,这个进程中只有一个主线程
#比如qq就是一个进程,qq这个进程中有很多的功能,
#线程是可以资源共享的(共享cpu的资源),但是进程是不可以资源共享的,比如360收不到qq消息
#能让操作系统工作起来的最小单位就是线程
#自己写的一个py文件中的一堆指令,就是一个线程。这堆指令被执行的时候,就调度了cpu
#或一个指令集就是一个线程
#只有一个cpu的话去执行多个程序,方法是以很快的速度去切换,用户是感受不到这个速度的,但是切换也是会有耽误时间的
#I/O密集型任务或函数(多用多线程,因为有阻塞的状态)
#计算密集型任务或函数(少用多线程,因为就是去计算,而且切换也是会有时间损耗)
#以下整体就是一个进程,这个进程包括了3个线程:一个主进程、两个子进程
#进程是线程资源的集合
#进程和线程执行速度是一样的,执行线程和执行进程是在执行同样的东西
import time
import threading #多线程模块
#I/O密集型 适合用多线程 因为有阻塞,比如time.sleep(1)就是一个阻塞
# begin = time.time() #主线程
# def foo(a):
# print('foo:%s' %a)
# time.sleep(1) #睡1秒钟 相当于I/O阻塞,那么cpu切换到别的子线程中去执行,如果都阻塞住,那么cpu就休息了
# print('end foo')
#
# def bar(a):
# print('bar:%s' %a)
# time.sleep(2) #睡1秒钟 不占用cpu,此时cpu就会执行别的子线程或者主线程
# print('end bar')
#
# t1 = threading.Thread(target=foo,args=(1,)) #创建了一个子线程对象t1,相当于foo(1) *****
# t1.start() #子线程执行 *****
# t2 = threading.Thread(target=bar,args=(2,)) #创建了一个子线程对象t2,相当于bar(2) *****
# t2.start() #子线程执行 *****
#
# end = time.time() #主线程
# print(end-begin) #打印程序执行的时间 #主线程
#子线程和主线程是并驾齐驱的,同时执行 谁快谁慢 是抢占式的
#至于同时显示(主线程和子线程)程序执行的结果,是因为切换的速度快,也就是说,在一个时刻,也是只有一条代码在执行,即使是有子线程和主线程,只不过在某条程序有阻塞的时候会去执行别的子线程
#而子线程中的其余的程序也是一起执行的,线程之间可以数据共享,进程不可以(但是可以通过队列等进行通信)
#Cpython中有一个解释器锁GIL,表示在同一时刻,只能有一个线程,如果有多个线程,那么就会去竞争
#因为有了GIL,所以多核cpu也没用了
#GIL是不让一个进程中的多个线程同时跑,但是让多个进程同时跑,每个进程分配每个cpu即可
# foo(1)
# bar(2) #这样执行是串行执行代码
#并行是好几个cpu同时在工作
#阻塞:比如上次的程序中的等待客户端来连接服务端就是一个阻塞
#计算密集型 不适合用多线程 因为总是要执行完所有的计算过程的,而且计算过程肯定是没有阻塞的
# begin = time.time()
def add(n):
sum = 0
for i in range(n):
sum += i
print(sum)
# add(1000000)
# add(2000000)
#
# end = time.time()
# print(end-begin)
begin = time.time()
t3 = threading.Thread(target=add,args=(1000000,))
t3.start()
t4 = threading.Thread(target=add,args=(2000000,))
t4.start()
end = time.time()
print(end-begin)
# 结论:在python中
# if 任务是IO密集型的 可以用多线程
# if 任务是计算密集型的 改用c语言
#join:谁调用join,谁就阻塞住,如t1.join()表示如果t1没有执行完,其余的谁也不能去执行,其实就是串行,没有多大的意义
# for t in thread: #假如thread=[t1,t2]
# t.start()
# t.join() #不在for循环内时,这一句等价于t2.join()
#Daemon: t1.setDaemon(True)设置守护线程,只要是主线程结束了,那么t1子线程也立马结束,其余线程正常执行
print(threading.current_thread()) #打印当前执行的线程
print(threading.active_count()) #打印没有结束的线程
#注:Cpython是用c语言写的python解释器
图 多进程解决Cpyton中的GIL问题
最近特别的想回家,不知道是为什么,刚刚三点的时候和我妹妹微信语音了大概三十多分钟,主要是给她说了一下这次期中考试的事情,别的顺带的问了一下,
知道我爸在干什么,我妈在干什么,就很知足了,最重要的是不想再让我爸妈那么的辛苦了;我知道最近家里在盖浴室,爸妈肯定都累坏了。
我知道目前我还不是能够让我爸妈引以为豪的儿子,以后可能会慢慢标号的吧。
现在在听beyond的大地,其中有一句评论:我离天空最高的一次,是你把我高高的举过了你的肩头。
haijing in HZ
2018.11.18 周末 傍晚 雨