python用多线程处理任务并发情况。thread生命周期:1、创建对象时,代表 Thread 内部被初始化。2、调用 start() 方法后,thread 会开始运行。
3、thread 代码正常运行结束或者是遇到异常,线程会终止。函数表达式:threading.Thread(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)
直接创建thread,传递callable(可调用)对象。从输出可以看出,两个任务同时执行。
import threading import time def test(): 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 main 00 Sun Oct 25 15:07:05 2020 Sun Oct 25 15:07:05 2020 test main 11 Sun Oct 25 15:07:06 2020Sun Oct 25 15:07:06 2020 test main 22 Sun Oct 25 15:07:07 2020 Sun Oct 25 15:07:07 2020 test main 33 Sun Oct 25 15:07:08 2020Sun Oct 25 15:07:08 2020 test main 44 Sun Oct 25 15:07:09 2020 Sun Oct 25 15:07:09 2020
thread.current_thread() .name返回线程名字
import threading import time def test(): 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""" testthreadtestMainThreadmain 00 Sun Oct 25 15:35:55 2020Sun Oct 25 15:35:55 2020 MainThreadmaintestthreadtest 11 Sun Oct 25 15:35:56 2020Sun Oct 25 15:35:56 2020 MainThreadmaintestthreadtest 2 2 Sun Oct 25 15:35:57 2020 Sun Oct 25 15:35:57 2020 MainThreadmain testthreadtest 33 Sun Oct 25 15:35:58 2020Sun Oct 25 15:35:58 2020 testthreadtestMainThreadmain 44 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)
import threading import time def test(): 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 Oct 25 16:15:08 2020 testthreadtest 1 Sun Oct 25 16:15:09 2020 testthreadtest 2 Sun Oct 25 16:15:09 2020 testthreadtest 3 Sun Oct 25 16:15:10 2020 testthreadtest 4 Sun Oct 25 16:15:10 2020 MainThreadmain 0 Sun Oct 25 16:15:11 2020 testthreadis alive False MainThreadmain 1 Sun Oct 25 16:15:12 2020 testthreadis alive False MainThreadmain 2 Sun Oct 25 16:15:13 2020 testthreadis alive False MainThreadmain 3 Sun Oct 25 16:15:14 2020 testthreadis alive False MainThreadmain 4 Sun Oct 25 16:15:15 2020 testthreadis alive False
thread中的 daemon 属性。Thread 的构造方法中有一个 daemon 参数,默认是 None。如果要达到,MainThread 结束,子线程也立马结束,怎么做呢?
可以在子线程的构造器中传递 daemon 的值为 True。 thread = threading.Thread(target=test,name='TestThread',daemon=True)
面向对象编程实现以上线程代码:自定义一个 Thread 的子类,然后复写它的 run() 方法
import threading import time class TestThread(threading.Thread): def __init__(self, name=None): threading.Thread.__init__(self,name=name) def run(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)
睡眠排序法
import threading from time import sleep,ctime lst=[1,3,2,4] def f(n): sleep(n) print(n,threading.current_thread().name,ctime()) threads=[] for i in range(len(lst)): thread = threading.Thread(target=f,args=(lst[i])) threads.append(thread) for i in range(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
import threading class MyThreading(threading.Thread): def __init__(self, func, arg): super(MyThreading, self).__init__() self.func = func self.arg = arg # 重写run()方法 def run(self): self.func(self.arg) def my_func(args): ''' 此处可以把你想让线程做的事定义在这里 ''' print("我是业务函数...") pass obj = MyThreading(my_func, 123) obj.start()
import threading from time import sleep,ctime class Mythread(threading.Thread): def __init__(self, func, args): threading.Thread.__init__(self) self.func = func self.args = args #重写run()方法 def run(self): self.func(self.args) lst = [2,4,3,5] def my_func(n): sleep(n) print(n,threading.current_thread().name,ctime()) threads=[] for i in range(len(lst)): thread = Mythread(my_func,args=(lst[i])) threads.append(thread) for i in range(len(lst)): threads[i].start()