我觉得在讲解该章节之前,如果说我们不了解什么是线程,什么是进程,那么请自行进行查阅。这是基础,我在这里不说明有什么区别,只看关键因素,如何使用python去做并发编程;
python实现多线程,也是将会用到线程支持模块来支持;什么呢,threading,名字就是这么直接;下面看一下如何创建然后启动线程
==============================================================
使用 threading 模块中 Thread 类的构造器创建线程。即直接对类 threading.Thread 进行实例化创建线程,并调用实例化对象的 start() 方法启动线程。
继承 threading 模块中的 Thread 类创建线程类。即用 threading.Thread 派生出一个新的子类,将新建类实例化创建线程,并调用其 start() 方法启动线程。
import threading
import time
#定义线程要调用的方法,*add可接收多个以非关键字方式传入的参数
def action(add):
#调用 getName() 方法获取当前执行该程序的线程名
print(threading.current_thread().getName() +" "+ add)
def action2(**kwargs):
# 调用 getName() 方法获取当前执行该程序的线程名
for key,value in kwargs.items():
print("the key is %s and the value is %s"%(key,value))
#定义为线程方法传入的参数
#my_tuple = ["http://c.biancheng.net/python/",\
# "http://c.biancheng.net/shell/",\
# "http://c.biancheng.net/java/"]
my_tuple = "aaa"
my_dict = {
"1":1,
"2":2
}
#action(my_tuple)
#创建线程
thread1 = threading.Thread(target = action,args =(my_tuple,))
thread2 = threading.Thread(target = action2,kwargs =my_dict)
thread1.start()
thread2.start()
time.sleep(1)
action2(location="aaa",site="bbb")
通过上面这个例子,我们简单的可以看出thread是如何用的,这里面有两点是需要注意的
第一个是我们要观察一下thread函数的参数,他之中包括target,args,kwargs,这其中target代表的是目标函数,也就是要起线程的函数,args代表的是任意多个参数,kwargs代表的是任意多个关键字参数;这似乎没什么问题,但是,这里面我们看到,我们传给args的参数,无论是否包含多个,都必须以元组的方式传递进去,而且,哪怕只有一个,也必须这样,并且后面有逗号;而对于关键字的参数,我们看到必须是以字典的方式传递进去;相对于如果不使用线程直接调用的话,我们可以直接进行传递
此外,这里我们还必须要总结一下多个参数的传递
import threading
import time
#定义线程要调用的方法,*add可接收多个以非关键字方式传入的参数
def action(*add):
#调用 getName() 方法获取当前执行该程序的线程名
print(threading.current_thread().getName() +" "+ str(add))
my_tuple = 'aaa'
action(my_tuple)
打印结果:
MainThread ('aaa',)
看到了嘛,这里的话,我们要想真的获取到内容,就只能通过for去取里面的内容或者是通过下标去访问;
如果掌握了上面的方法,是否就意味着已经学会了如何正确的学会了线程的创建呢?当然不是,前面说到 线程也不过就是一个类,如例子1来说,thread1也不过是Thread创造出来的对象;是吧;我们再看一下啊,在创造类的时候,很麻烦;那么我们就可以用新的办法来使得自己创造属于自己的线程类;这样的话,我们就可以很好的改变自己的方法;
class myThread(threading.Thread):
def __init__(self,add):
#super().__init__()
threading.Thread.__init__(self)
self.add = add
def run(self):
for arc in self.add:
# 调用 getName() 方法获取当前执行该程序的线程名
print(threading.current_thread().getName() + " " + arc)
my_tuple = ("http://c.biancheng.net/python/",\
"http://c.biancheng.net/shell/",\
"http://c.biancheng.net/java/")
#创建子线程
mythread = myThread(my_tuple)
#启动子线程
mythread.start()
#主线程执行此循环
for i in range(5):
print(i)
print(threading.current_thread().getName())
其中是这样的;这里面要想按照自己的方法去start新的线程;那么就需要去自己写一个属于自己的类;然后继承init方法和run方法;其中run方法重写,这样start就会按照自己的想法去start;init必须要继承父类的基础上,增加一些属于自己的元素;这里需要记住的是;start执行,是run方法;一定要记住