专栏首页python3python—多线程

python—多线程

一、多线程实例

  线程时应用程序中工作的最小单位,python中提供了threading模块来对多线程操作,一般多核cpu采用多进程方式,单核才采用多线程方式

  方法:

  将要执行的方法threading.Thread作为参数传给构造方法(和多进程类似),格式如下:

  t = threading.Thread(target=action,args=(i,))

例子:

import threading

def worker(n):
    print("start worker{0}".format(n))
    
class Mythread(threading.Thread):
    def __init__(self,args):
        super(Mythread,self).__init__() # super(Mythread,self)超类,将类接收到的参数threading.Thread,传给构造函数,最后赋值给self.args,便于类中其他函数调用
        self.args = args
        
    def run(self):
        print("start Mythread {0}".format(self.args))
        
if __name__ == "__main__":
    for i in range(1,6):
        t1 = threading.Thread(target=worker,args=(i,))
        t1.start()
    t1.join()
    
    for x in range(6,11):
        t2 = Mythread(x)
        t2.start()
    t2.join()

运行结果:

start worker1

start worker2

start worker3

start worker4

start worker5

start Mythread 6

start Mythread 7

start Mythread 8

start Mythread 9

start Mythread 10

扩展:super()方法的语法: super(type[, object-or-type]);type -- 类名,object-or-type --对象或类型,一般为self

例子:

class Parent(object):
   def __init__(self):
       self.parent = "Good"
       print ('Parent')
   def identity(self, message):
       print ("%s I'm parent" % message)
       
class Child(Parent):
   def __init__(self):
       super(Child, self).__init__()  #首先找到Child的父类(Parent),然后把类Child的对象转换为类Parent的对象,调用父类的构造函数__init__()
       print ('Child')
       print("******"*4)
       
   def identity(self, message):
       super(Child, self).identity(message) #首先找到Child的父类(Parent),然后把类Child的对象转换为类Parent的对象,调用父类的identity(message)函数
       print ("I'm child")
       print("******" * 4)
       print (self.parent)
       
if __name__ == '__main__':
   Test = Child()
   Test.identity('hello China')

运行结果:

Parent

Child

************************

hello China I'm parent

I'm child

************************

Good

二、线程锁

  通过threading.Lock()来创建锁,函数在执行前先获得锁,执行后释放锁,和进程锁相似

  with lock:

  或者

  lock.acquire()  #先获得锁

  ...

  lock.release()  #执行完,释放锁

例子:

import threading
import time
def worker(name,lock):
    with lock:   
        print("start {0}".format(name))
        time.sleep(3)
        print("end {0}".format(name))
        
if __name__ == "__main__":
    lock = threading.Lock()  
    t1 = threading.Thread(target=worker,args=("worker1",lock))
    t2 = threading.Thread(target=worker,args=("worker2", lock))
    
    t1.start()
    t2.start()
    print ("main end")

运行结果:

start worker1

main end

end worker1

start worker2

end worker2

说明:只有线程1结束以后,线程2才能执行

三、线程共享变量

  多线程和多进程不同之处在于多线程本身就是可以和父进程进行共享内存的,这也是为什么其中一个线程挂掉之后,其他线程也死掉的原因

例子:

import threading
def worker(l):
    l.append("hello")
    l.append("china")
    l.append("world")
    
if __name__ == "__main__":
    l = list()
    l += range(1,5)
    print(l)
    
    t = threading.Thread(target=worker,args=(l,))
    t.start()
    print(l)

运行结果:

[1, 2, 3, 4]

[1, 2, 3, 4, 'hello', 'china', 'world']

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • vim 的python 语法高亮

    vim支持大部分文件格式的语法高亮,而且可以自定义。不过缺省的python语法高亮感觉太少,修改一下。

    用户2398817
  • 初学python,调用固定参,不固定参

    函数调用时的参数传递方式:(调用函数) 传递方式有以下四种: 位置传参 序列传参 关键字传参 字典关键字传参 -------------------------...

    用户2398817
  • 看代码学习python基础

    用户2398817
  • enum 枚举包含数量

    用户1130771
  • Python学习之迭代器和生成器

    在Python如果一个对象可被循环(遍历)该对象中每一个元素的过程叫做迭代。例如 ,字典、字符串、列表、元祖、集合等。他们可被迭代的原因是,都有一个共同的内置函...

    用户2398817
  • 迭代器执行流程

    用户2398817
  • 在已安装python3.7的环境基础上,

    2. 下载Anaconda安装包:推荐去清华大学开源软件镜像站下载,因为官网上下载会比较慢而且不稳定,比如我在官网下载到一半时就莫名中断了(不知为啥),所以还是...

    用户2398817
  • Python|生成器

    01 列表生成式的缺点 通过列表生成式,我们可以直接创建一个列表。但是,内存数量有限,列表容量肯定不能超过内存大小。 再有,创建一个包含100万个元素的列表...

    double
  • windows程序设计-第四章 system2.c 新增滚动条功能

    新添加的滚动条功能,首先就是要在createWindow的时候,修改参数风格模式 hwnd = CreateWindow (szAppName, TE...

    用户1154259
  • 从JS引擎理解Await b()与Promise.then(b)的堆栈处理

    与直接使用 Promise 相比,使用Async/Await不仅可以提高代码的可读性,同时也可以优化 JavaScript 引擎的执行方式。这篇博客将介绍 As...

    Fundebug

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动