python用多线程处理任务并发情况。thread生命周期:1、创建对象时,代表 Thread 内部被初始化。2、调用 start() 方法后,thread 会开始运行。
3、thread 代码正常运行结束或者是遇到异常,线程会终止。函数表达式:threading.Thread(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)
直接创建thread,传递callable(可调用)对象。从输出可以看出,两个任务同时执行。
importthreadingimporttimedeftest():for i in range(5):print('test',i,time.ctime())
time.sleep(1)
thread= threading.Thread(target=test)
thread.start()for i in range(5):print("main",i,time.ctime())
time.sleep(1)
"""output"""test main00 Sun Oct 25 15:07:05 2020Sun Oct25 15:07:05 2020test main11 Sun Oct 25 15:07:06 2020Sun Oct 25 15:07:06 2020test main22 Sun Oct 25 15:07:07 2020Sun Oct25 15:07:07 2020test main33 Sun Oct 25 15:07:08 2020Sun Oct 25 15:07:08 2020test main44 Sun Oct 25 15:07:09 2020Sun Oct25 15:07:09 2020
thread.current_thread() .name返回线程名字
importthreadingimporttimedeftest():for i in range(5):print(threading.current_thread().name+"test",i,time.ctime())
time.sleep(1)
thread= threading.Thread(target=test,name="testthread")
thread.start()for i in range(5):print(threading.current_thread().name+"main",i,time.ctime())
time.sleep(1)
"""output"""testthreadtestMainThreadmain00 Sun Oct 25 15:35:55 2020Sun Oct 25 15:35:55 2020MainThreadmaintestthreadtest11 Sun Oct 25 15:35:56 2020Sun Oct 25 15:35:56 2020MainThreadmaintestthreadtest2 2 Sun Oct 25 15:35:57 2020Sun Oct25 15:35:57 2020MainThreadmain testthreadtest33 Sun Oct 25 15:35:58 2020Sun Oct 25 15:35:58 2020testthreadtestMainThreadmain44 Sun Oct 25 15:35:59 2020Sun Oct 25 15:35:59 2020
Thread 的 is_alive() 方法查询线程是否还在运行。is_alive() 返回 True 的情况是 Thread 对象被正常初始化,start() 方法被调用,
然后线程的代码还在正常运行。join()提供线程阻赛手段,让一个线程先运行,一个后运行。默认的情况是,join() 会一直等待对应线程的结束,
但可以通过参数赋值,等待规定的时间就好了:join(timeout=None)
importthreadingimporttimedeftest():for i in range(5):print(threading.current_thread().name+"test",i,time.ctime())
time.sleep(0.5)
thread= threading.Thread(target=test,name="testthread")
thread.start()
thread.join()for i in range(5):print(threading.current_thread().name+"main",i,time.ctime())print(thread.name + "is alive", thread.is_alive())
time.sleep(1)
"""output"""testthreadtest 0 Sun Oct25 16:15:08 2020testthreadtest1 Sun Oct 25 16:15:09 2020testthreadtest2 Sun Oct 25 16:15:09 2020testthreadtest3 Sun Oct 25 16:15:10 2020testthreadtest4 Sun Oct 25 16:15:10 2020MainThreadmain 0 Sun Oct25 16:15:11 2020testthreadis alive False
MainThreadmain1 Sun Oct 25 16:15:12 2020testthreadis alive False
MainThreadmain2 Sun Oct 25 16:15:13 2020testthreadis alive False
MainThreadmain3 Sun Oct 25 16:15:14 2020testthreadis alive False
MainThreadmain4 Sun Oct 25 16:15:15 2020testthreadis alive False
thread中的 daemon 属性。Thread 的构造方法中有一个 daemon 参数,默认是 None。如果要达到,MainThread 结束,子线程也立马结束,怎么做呢?
可以在子线程的构造器中传递 daemon 的值为 True。 thread = threading.Thread(target=test,name='TestThread',daemon=True)
面向对象编程实现以上线程代码:自定义一个 Thread 的子类,然后复写它的 run() 方法
importthreadingimporttimeclassTestThread(threading.Thread):def __init__(self, name=None):
threading.Thread.__init__(self,name=name)defrun(self):for i in range(5):print(threading.current_thread().name + "test",i)
time.sleep(1)
thread= TestThread(name="testthread")
thread.start()for i in range(5):print(threading.current_thread().name + "main",i)print(thread.name + "is alive", thread.is_alive())
time.sleep(1)
睡眠排序法
importthreadingfrom time importsleep,ctime
lst=[1,3,2,4]deff(n):
sleep(n)print(n,threading.current_thread().name,ctime())
threads=[]for i inrange(len(lst)):
thread= threading.Thread(target=f,args=(lst[i]))
threads.append(thread)for i inrange(len(lst)):
threads[i].start()
"""OUTPUT"""
1 Thread-1 Sun Oct 25 22:40:57 2020
2 Thread-3 Sun Oct 25 22:40:58 2020
3 Thread-2 Sun Oct 25 22:40:59 2020
4 Thread-4 Sun Oct 25 22:41:00 2020
importthreadingclassMyThreading(threading.Thread):def __init__(self, func, arg):
super(MyThreading, self).__init__()
self.func=func
self.arg=arg#重写run()方法
defrun(self):
self.func(self.arg)defmy_func(args):'''此处可以把你想让线程做的事定义在这里'''
print("我是业务函数...")passobj= MyThreading(my_func, 123)
obj.start()
importthreadingfrom time importsleep,ctimeclassMythread(threading.Thread):def __init__(self, func, args):
threading.Thread.__init__(self)
self.func=func
self.args=args#重写run()方法
defrun(self):
self.func(self.args)
lst= [2,4,3,5]defmy_func(n):
sleep(n)print(n,threading.current_thread().name,ctime())
threads=[]for i inrange(len(lst)):
thread= Mythread(my_func,args=(lst[i]))
threads.append(thread)for i inrange(len(lst)):
threads[i].start()