Python多线程基础
示例
使用该threading模块,可以通过创建新的执行线程threading.Thread并为其分配执行功能来启动新的执行线程:
import threading def foo(): print "你好线程!" my_thread = threading.Thread(target=foo)
该target参数引用要运行的函数(或可调用对象)。直到start在Thread对象上调用该线程后,该线程才会开始执行。
启动线程
my_thread.start() # prints '你好线程!'
现在my_thread已经运行并终止了,start再次调用将产生一个RuntimeError。如果您想将线程作为守护程序运行,则在调用之前传递daemon=Truekwarg或设置my_thread.daemon为,会使您作为守护程序在后台静默运行。Truestart()Thread
加入线程
如果您将一个大工作分解为几个小工作,并希望同时运行它们,但是又需要等待所有工作完成才可以继续,那是您要找的方法。Thread.join()
例如,假设您要下载网站的多个页面并将它们编译为一个页面。您可以这样做:
import requests
from threading import Thread
from queue import Queue
q = Queue(maxsize=20)
def put_page_to_q(page_num):
q.put(requests.get('http://some-website.com/page_%s.html' % page_num)
def compile(q):
#魔术功能,需要所有页面才能执行
if not q.full():
raise ValueError
else:
print("完成编译!")
threads = []
for page_num in range(20):
t = Thread(target=requests.get, args=(page_num,))
t.start()
threads.append(t)
#接下来,加入所有线程以确保所有线程在运行之前都已完成
#我们继续。join()是一个阻塞调用(除非另行指定,否则使用
#调用加入时,kwarg阻止=False)
for t in threads:
t.join()
#由于所有线程均已完成,因此立即调用compile()
compile(q)在join()这里可以更仔细地了解工作原理。
创建一个自定义线程类
使用threading.Thread类,我们可以继承新的自定义Thread类。我们必须重写run子类中的方法。
from threading import Thread
import time
class Sleepy(Thread):
def run(self):
time.sleep(5)
print("Hello form Thread")
if __name__ == "__main__":
t = Sleepy()
t.start() #start方法自动调用Thread类的run方法。
#打印“主程序继续在前台运行。”
t.join()
print("主程序继续在前台运行。")