python基础(18)-线程概况

我觉得在讲解该章节之前,如果说我们不了解什么是线程,什么是进程,那么请自行进行查阅。这是基础,我在这里不说明有什么区别,只看关键因素,如何使用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方法;一定要记住

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 线程 操作系统线程理论 线程概念的引入背景 进程 之前我们已经了解了操作系统中进程的概念,程序并不能单独运行,只有...
    go以恒阅读 1,670评论 0 6
  • 一文读懂Python多线程 1、线程和进程 计算机的核心是CPU,它承担了所有的计算任务。它就像一座工厂,时刻在运...
    星丶雲阅读 1,480评论 0 4
  • 写在前面的话 代码中的# > 表示的是输出结果 输入 使用input()函数 用法 注意input函数输出的均是字...
    FlyingLittlePG阅读 2,822评论 0 8
  • 关于Python多线程的概述 由于GIL的存在,Python的多线程在CPU密集型任务并没有多大的优势,任何Pyt...
    千鸟月读阅读 553评论 0 0
  • 姓名:李格 公司:海南蔚蓝时代实业有限公司 组别:第420期乐观4组 【日精进打卡第502天】 【知~学习】 背诵...
    熊猫酱panda阅读 68评论 0 0