使用threading这个高级模块
run(): 用以表示线程活动的方法。
start():启动线程活动。
join([time]): 等待至线程中止。这阻塞调用线程直至线程的join() 方法被调用中止-正常退出或者抛出未处理的异常-或者是可选的超时发生。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time:2021/3/27 10:55
# @Author:九九的金金子
import logging
import threading
from time import ctime, sleep
logging.basicConfig(level=logging.INFO)
loops = [1, 2]
# 我们可以通过直接从 threading.Thread 继承创建一个新的子类,并实例化后调用 start() 方法启动新线程,即它调用了线程的 run() 方法:
class MyThread(threading.Thread):
# 改写线程
def __init__(self, func, args, name=''):
threading.Thread.__init__(self)
self.func = func
self.args = args
self.name = name
def run(self):
self.func(*self.args)
def loop(nloop, nsec):
logging.info("start loop " + str(nloop) + "at" + ctime())
sleep(nsec)
logging.info("end loop " + str(nloop) + "at" + ctime())
def main():
logging.info("star all at " + ctime())
threads = []
nloops = range(len(loops))
for i in nloops:
# 创建新线程
t = MyThread(loop, (i, loops[i]), loop.__name__)
threads.append(t)
for i in nloops:
# 并发执行
threads[i].start()
for i in nloops:
threads[i].join()
logging.info("end all at " + ctime())
if __name__ == '__main__':
main()
执行结果:
INFO:root:star all at Sat Mar 27 12:17:20 2021
INFO:root:start loop 0atSat Mar 27 12:17:20 2021
INFO:root:start loop 1atSat Mar 27 12:17:20 2021
INFO:root:end loop 0atSat Mar 27 12:17:21 2021
INFO:root:end loop 1atSat Mar 27 12:17:22 2021
INFO:root:end all at Sat Mar 27 12:17:22 2021