Py学习  »  python开源

Python 多线程(01)

夏天 • 5 年前 • 459 次点击  

Python-多线程

进程-进程有自己的完全独立的运行环境,多进程共享数据是个问题 线程-一个进程独立运行的片段,一个进程可以有多个线程 全局解释器(GTL) -python代码的执行是由python虚拟机进行控制 -在主循环中只能有一个控制线程在执行

python包 -thread:之前应用的版本,python3改成了_thread -threading:先行通行的包 1. * 1. 学习python加python编程语言学习 QQ群515267276 案例

''' 利用time函数生成两个函数,顺序调用,计算总的计算时间 ''' import time def loop1(): #ctime得到当前时间 print("start loop1 at ",time.ctime()) #sleep time.sleep(4) print("end loop1 at",time.ctime()) def loop2(): print("start loop2 at ", time.ctime()) # sleep time.sleep(2) print("end loop2 at", time.ctime()) def main(): print("start at",time.ctime()) loop1() loop2() print("all done at ",time.ctime())

if name=="main":

main()

运行结果如下: start at Mon Jan 7 09:18:44 2019 start loop1 at Mon Jan 7 09:18:44 2019 end loop1 at Mon Jan 7 09:18:48 2019 start loop2 at Mon Jan 7 09:18:48 2019 end loop2 at Mon Jan 7 09:18:50 2019 all done at Mon Jan 7 09:18:50 2019

案例2(案例1使用多线程)

def loop1(): #ctime得到当前时间 print("start loop1 at ",time.ctime()) #sleep time.sleep(4) print("end loop1 at",time.ctime()) def loop2(): print("start loop2 at ", time.ctime()) # sleep time.sleep(2) print("end loop2 at", time.ctime()) def main(): print("start at",time.ctime()) #启动多线程的意思使用多线程去执行某个函数 threading.Thread(target=loop1).start() threading.Thread(target=loop2).start() print("all done at ",time.ctime())

if name=="main": main()

20 运行结果如下: start at Mon Jan 7 09:31:46 2019 start loop1 at Mon Jan 7 09:31:46 2019 start loop2 at Mon Jan 7 09:31:46 2019 all done at Mon Jan 7 09:31:46 2019 end loop2 at Mon Jan 7 09:31:48 2019 end loop1 at Mon Jan 7 09:31:50 2019

案例3(多线程+参数)

import time import threading import _thread as thread def loop1(in1): #ctime得到当前时间 print("start loop1 at ",time.ctime()) print("gram1",in1) #sleep time.sleep(4) print("end loop1 at",time.ctime()) def loop2(in1,in2): print("start loop2 at ", time.ctime()) # sleep print("gram1",in1,"gram2",in2)

time.sleep(2)
print("end loop2 at", time.ctime())

def main(): print("start at",time.ctime()) #启动多线程的意思使用多线程去执行某个函数 #启动多线程的函数为start_new_thread #参数有两个一个是需要运行的函数,另一个参数作为元祖使用 #如果有一个参数时一定要价格逗号 thread.start_new_thread(loop1,("beijing",)) thread.start_new_thread(loop2,("tianjin","hangzhou")) print("all done at ",time.ctime())

if name=="main": main() while True: time.sleep(8)

运行结果如下: start at Mon Jan 7 09:50:48 2019 all done at Mon Jan 7 09:50:48 2019 start loop1 at Mon Jan 7 09:50:48 2019 gram1 beijing start loop2 at Mon Jan 7 09:50:48 2019 gram1 tianjin gram2 hangzhou end loop2 at Mon Jan 7 09:50:50 2019 end loop1 at Mon Jan 7 09:50:52 2019

threading的使用 -t=threading.Thread(target=XXX,args=(xxx,)) -t.start():启动多线程 -t.join():等待多线程执行完成

案例04

import time import threading import _thread as thread def loop1(in1): #ctime得到当前时间 print("start loop1 at ",time.ctime()) print("gram1",in1) #sleep time.sleep(4) print("end loop1 at",time.ctime()) def loop2(in1,in2): print("start loop2 at ", time.ctime()) # sleep print("gram1",in1,"gram2",in2)

time.sleep(2)
print("end loop2 at", time.ctime())

def main(): print("start at",time.ctime()) #启动多线程的意思使用多线程去执行某个函数

t1=threading.Thread(target=loop1,args=("beijing",))
t2=threading.Thread(target=loop2, args=("tianjin","hangzhou"))
t1.start()
t2.start()
t1.join()
t2.join()
print("all done at ",time.ctime())

if name=="main": main()

8

运行结果如下: start at Mon Jan 7 10:06:10 2019 start loop1 at Mon Jan 7 10:06:10 2019 gram1 beijing start loop2 at Mon Jan 7 10:06:10 2019 gram1 tianjin gram2 hangzhou end loop2 at Mon Jan 7 10:06:12 2019 end loop1 at Mon Jan 7 10:06:14 2019 all done at Mon Jan 7 10:06:14 2019

守护线程 -如果在程序中将子线程设置成守护线程,则子线程惠子啊主程序结束的时候自动退出 -一般认为守护线程不重要或者不允许离开主线程独立运行 案例5

import time import threading import _thread as thread def fun(): print("start fun") time.sleep(2) print("end fun") print("main thraed")

t1=threading.Thread(target=fun,args=())

将t1设置成守护线程

t1.setDaemon(True) t1.start() time.sleep(1) print("main thread dead")

运行结果如下: main thraed start fun main thread dead

线程常用的属性 -threading.currentThread:返回当前线程呢个变量 -threading.enumerate:返回一个包含正在运行线程的list -threading.activeCount:返回正在运行的线程的数量 -thr.setName:给线程设置名字 -thr.getName:得到线程的名字

直接继承自thread.Thread -直接继承Thread -重写run函数 -类实例可以直接运行 案例6

import time import threading

类需要继承自threading.Thread

class MyThread(threading.Thread): def init(self,arg): super(MyThread, self).init() self.arg=arg #必须重写run函数,是真正执行的功能 def run(self): time.sleep(2) print("the args for this class is {0}".format(self.arg)) for i in range(5): t=MyThread(i) t.start() t.join() print("main thread is done")

运行结果如下: the args for this class is 0 the args for this class is 1 the args for this class is 2 the args for this class is 3 the args for this class is 4 main thread is done

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/28094
 
459 次点击