#多进程与多线程
-进程:程序运行的一个状态 -包含地址空间/内存/数据栈等 -每个进程有自己独立运行的空间,但数据共享是一个问题-线程 -一个进程的独立运行片段,一个进程可以有多个线程 -轻量化的进程 -一个进程的多个线程间可以共享数据和上下文运行环境 -互斥问题-全局解锁器(GIL) -python代码的执行是由python虚拟机进行控制 -规定只能由一个控制线程在执行-python包 -thread:有问题,不好用,python3改成了_thread -threading:通用的包,现在主流在用 -以下案例总结 -案例01:使用多线程,可以缩短程序执行时间,使用_thread -案例02:多线程,传参数-案例01#利用time函数,生成两个函数,顺序调用,计算总的运行时间import timeimport _thread as threaddef loop1(): #ctime得到当前时间 print("Start loop 1 at:",time.ctime()) #睡眠时间 time.sleep(4) print("End loop 1 at:",time.ctime()) def loop2(): #ctime得到当前时间 print("Start loop 2 at:",time.ctime()) #睡眠时间 time.sleep(2) print("End loop 2 at:",time.ctime()) def main(): print("Start at:",time.ctime()) #启用多线程去执行两个函数 #写法为start_new_thread #后面的括号必须有,用于放参数 thread.start_new_thread(loop1,()) thread.start_new_thread(loop2,()) print("End at:",time.ctime()) if __name__ == "__main__" main() while True: time.sleep(10) #此处循环,是为了在上述两个线程完成之前,主线程要等待,不然主线程会直接继续工作,其他两个线程没有主线程运行的快,无法输出结果。
-案例02import timeimport _thread as threaddef loop1(in1): #ctime得到当前时间 print("Start loop 1 at:",time.ctime()) print("我是笨蛋",in1) #睡眠时间 time.sleep(4) print("End loop 1 at:",time.ctime()) def loop2(in1,in2): #ctime得到当前时间 print("Start loop 2 at:",time.ctime()) print("我是笨蛋",in1,"和傻瓜",in2) #睡眠时间 time.sleep(2) print("End loop 2 at:",time.ctime())def main(): print("Start at:",time.ctime()) #启用多线程去执行两个函数 #写法为start_new_thread #后面的括号必须有,用于放参数 thread.start_new_thread(loop1,("pangqi")) thread.start_new_thread(loop2,("pangqi","benqi")) print("End at:",time.ctime()) if __name__ == "__main__" main() while True: time.sleep(10)
-threading的使用
-直接利用threading.Thread生成Thread实例 1 t = threading.Thread(target=xxx,args=(xx,)) 2 t.start(): 启动多线程 3 t.join():等待多线程执行完成 以下案例03-案例03 import timeimport threadingdef loop1(in1): #ctime得到当前时间 print("Start loop 1 at:",time.ctime()) print("我是笨蛋",in1) #睡眠时间 time.sleep(4) print("End loop 1 at:",time.ctime()) def loop2(in1,in2): #ctime得到当前时间 print("Start loop 2 at:",time.ctime()) print("我是笨蛋",in1,"和傻瓜",in2) #睡眠时间 time.sleep(2) print("End loop 2 at:",time.ctime()) def main(): print("Start at:",time.ctime()) #启用多线程去执行两个函数 #生成threading.Thread实例 t1 = threading.Thread(target=loop1,args=("pangqi",)) t1.start() t2 = threading.Thread(target=loop2,args=("pangqi","benqi",)) t2.start() #直到t1 和 t2 都执行完成,才会往下执行 t1.join() t2.join() print("End at:",time.ctime()) if __name__ == "__main__" main() while True: time.sleep(10)
#守护线程 daemon
-如果在程序中将子线程设置成守护线程,则子线程会在主线程结束的同时自动退出-一般认为,守护线程不是特别重要,或不允许离开主线程独自运行-守护线程案例能否有效果跟环境相关(可能出现“说好一起到白头,你却偷偷焗了油”的现象)-案例04import timeimport threadingdef fun(): print("Start fun") time.sleep(2) print("End fun")print("Main thread")t1 = threading.Thread(target=fun,args=())t1.setDaemon(True)t1.start()time.sleep(1)print("Main thread end") #线程常用属性 -threading.currentThread:返回当前线程变量 -threading.enumerate:返回一个包含正在运行的线程的list -threading.activeCount:返回正在运行的线程数量 -thr.setName:给线程设置名字 -thr.getName:得到线程的名字
posted on 2018-09-12 20:53 阅读( ...) 评论( ...)