文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

python—多线程

2023-01-31 07:11

关注

一、多线程实例

  线程时应用程序中工作的最小单位,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']


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯