视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
在Python中通过threading模块定义和调用线程的方法
2020-11-27 14:28:56 责编:小采
文档


定义线程

最简单的方法:使用target指定线程要执行的目标函数,再使用start()启动。

语法:

class threading.Thread(group=None, target=None, name=None, args=(), kwargs={})

group恒为None,保留未来使用。target为要执行的函数名。name为线程名,默认为Thread-N,通常使用默认即可。但服务器端程序线程功能不同时,建议命名。

#!/usr/bin/env python3
# coding=utf-8
import threading

def function(i):
 print ("function called by thread {0}".format(i))
threads = []

for i in range(5):
 t = threading.Thread(target=function , args=(i,))
 threads.append(t)
 t.start()
 t.join()

执行结果:

$ ./threading_define.py 

function called by thread 0
function called by thread 1
function called by thread 2
function called by thread 3
function called by thread 4

确定当前线程

#!/usr/bin/env python3
# coding=utf-8

import threading
import time

def first_function():
 print (threading.currentThread().getName()+ str(' is Starting 
'))
 time.sleep(3)
 print (threading.currentThread().getName()+ str( ' is Exiting 
'))
 
def second_function():
 print (threading.currentThread().getName()+ str(' is Starting 
'))
 time.sleep(2)
 print (threading.currentThread().getName()+ str( ' is Exiting 
'))
 
def third_function():
 print (threading.currentThread().getName()+
 str(' is Starting 
'))
 time.sleep(1)
 print (threading.currentThread().getName()+ str( ' is Exiting 
'))
 
if __name__ == "__main__":
 t1 = threading.Thread(name='first_function', target=first_function)
 t2 = threading.Thread(name='second_function', target=second_function)
 t3 = threading.Thread(name='third_function',target=third_function)
 t1.start()
 t2.start()
 t3.start()

执行结果:

$ ./threading_name.py 

first_function is Starting 
second_function is Starting 
third_function is Starting 
third_function is Exiting 
second_function is Exiting 
first_function is Exiting

配合logging模块一起使用:

#!/usr/bin/env python3
# coding=utf-8

import logging
import threading
import time

logging.basicConfig(
 level=logging.DEBUG,
 format='[%(levelname)s] (%(threadName)-10s) %(message)s',
 )
 
def worker():
 logging.debug('Starting')
 time.sleep(2)
 logging.debug('Exiting')
 
def my_service():
 logging.debug('Starting')
 time.sleep(3)
 logging.debug('Exiting')
 
t = threading.Thread(name='my_service', target=my_service)
w = threading.Thread(name='worker', target=worker)
w2 = threading.Thread(target=worker) # use default name
w.start()
w2.start()
t.start()

执行结果:

$ ./threading_names_log.py[DEBUG] (worker ) Starting

[DEBUG] (Thread-1 ) Starting
[DEBUG] (my_service) Starting
[DEBUG] (worker ) Exiting
[DEBUG] (Thread-1 ) Exiting
[DEBUG] (my_service) Exiting


在子类中使用线程

前面我们的线程都是结构化编程的形式来创建。通过集成threading.Thread类也可以创建线程。Thread类首先完成一些基本上初始化,然后调用它的run()。run()方法会会调用传递给构造函数的目标函数。

#!/usr/bin/env python3
# coding=utf-8

import logging
import threading
import time

exitFlag = 0

class myThread (threading.Thread):
 def __init__(self, threadID, name, counter):
 threading.Thread.__init__(self)
 self.threadID = threadID
 self.name = name
 self.counter = counter
 
 def run(self):
 print ("Starting " + self.name)
 print_time(self.name, self.counter, 5)
 print ("Exiting " + self.name)
 
def print_time(threadName, delay, counter):
 while counter:
 if exitFlag:
 thread.exit()
 time.sleep(delay)
 print ("%s: %s" %(threadName, time.ctime(time.time())))
 counter -= 1
 
# Create new threads
thread1 = myThread(1, "Thread-1", 1)
thread2 = myThread(2, "Thread-2", 2)
# Start new Threads
thread1.start()
thread2.start()
print ("Exiting Main Thread")

执行结果:

$ ./threading_subclass.py 

Starting Thread-1
Starting Thread-2
Exiting Main Thread
Thread-1: Tue Sep 15 11:03:21 2015
Thread-2: Tue Sep 15 11:03:22 2015
Thread-1: Tue Sep 15 11:03:22 2015
Thread-1: Tue Sep 15 11:03:23 2015
Thread-2: Tue Sep 15 11:03:24 2015
Thread-1: Tue Sep 15 11:03:24 2015
Thread-1: Tue Sep 15 11:03:25 2015
Exiting Thread-1
Thread-2: Tue Sep 15 11:03:26 2015
Thread-2: Tue Sep 15 11:03:28 2015
Thread-2: Tue Sep 15 11:03:30 2015
Exiting Thread-2

下载本文
显示全文
专题