python-多线程-25
#多进程与多线程
-进程:程序运行的一个状态
-包含地址空间/内存/数据栈等
-每个进程有自己独立运行的空间,但数据共享是一个问题
-线程
-一个进程的独立运行片段,一个进程可以有多个线程
-轻量化的进程
-一个进程的多个线程间可以共享数据和上下文运行环境
-互斥问题
-全局解锁器(GIL)
-python代码的执行是由python虚拟机进行控制
-规定只能由一个控制线程在执行
-python包
-thread:有问题,不好用,python3改成了_thread
-threading:通用的包,现在主流在用
-以下案例总结
-案例01:使用多线程,可以缩短程序执行时间,使用_thread
-案例02:多线程,传参数
-案例01
#利用time函数,生成两个函数,顺序调用,计算总的运行时间
import time
import _thread as thread
def 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)
#此处循环,是为了在上述两个线程完成之前,主线程要等待,不然主线程会直接继续工作,其他两个线程没有主线程运行的快,无法输出结果。
-案例02
import time
import _thread as thread
def 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 time
import threading
def 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
-如果在程序中将子线程设置成守护线程,则子线程会在主线程结束的同时自动退出
-一般认为,守护线程不是特别重要,或不允许离开主线程独自运行
-守护线程案例能否有效果跟环境相关(可能出现“说好一起到白头,你却偷偷焗了油”的现象)
-案例04
import time
import threading
def 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 houziaipangqi 阅读(
...) 评论(
...) 编辑 收藏