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:得到线程的名字

猜你喜欢

转载自www.cnblogs.com/houziaipangqi/p/9637293.html