zoukankan      html  css  js  c++  java
  • 036线程进程(重要)

    相比Java,python简单很多,一个例子就可以理解
    ###########################
    有两种创建线程的方式,第一种是直接建立线程,把方法放进去,这是第一种:
    创建线程对象,参数设置要执行的方法以及方法的参数,然后执行start()方法,如下:

     1 import  threading
     2 import  time
     3 
     4 def foo(n):
     5     print('foo%s'%n)
     6     time.sleep(1)
     7     print('foo end')
     8 
     9 def  bar(n):
    10     print('bar%s'%n)
    11     time.sleep(2)
    12     print('bar end')
    13 
    14 begin = time.time()
    15 
    16 t1 = threading.Thread(target=foo,args=(1,))    # 创建线程对象,target是某个方法的地址,args是实参
    17 t2 = threading.Thread(target=bar,args=(2,))
    18 
    19 t1.start()      # 开启线程对象
    20 t2.start()
    21 print('main')
    22 
    23 end = time.time()
    24 print(end - begin)
    线程1

    运行结果:

    GIL:cpython解释器只能使用一个cpu,cpython里面会自动加个大锁,就是python不能够使用多核,不能发挥多核的作用
    改进方案就是使用多进程,/笑哭,或者运用到多计算和多I/O的,使用c语言
    开子进程是复制父进程的资源,十分消耗资源,所以难搞

    ################
    t.join()方法,可以阻塞住进程,一定要等t这个线程对象的线程运行完成才能继续执行后面的代码


    ##############################################
    ##守护线程Damen

    t.setDaemon(True)设置成True后,主线程结束它就会结束

    #####
    threading.current_thread()        # 拿到这个执行线程的名字
    threading.active_count()           # 活跃的线程

    ##############
    第二种创建线程的方式:继承线程类,覆盖run方法,然后创建对象,执行start()方法,就可以执行这个线程了,该线程执行的代码就是run里面的代码

    import threading
    import time
    
    class MyThread(threading.Thread):
        def __init__(self,num):
            threading.Thread.__init__(self)            # 注意这个构造方法
            self.num = num
    
        def run(self):#定义每个线程要运行的函数
            print('runningonnumber:%s'%self.num)
            time.sleep(3)
    
    if __name__ == '__main__':
        t1 = MyThread(1)
        t2 = MyThread(2)
        t1.start()
        t2.start()
    线程2

    两个另外的例子:

    # 01 要多线程执行的方法作为参数创建线程

    import threading
    import time
    class Person_thread:
        def __init__(self,name):
            self.pname = name
        def show(self):
            for i in range(100):
                print(self.pname,'*******',threading.current_thread(),'--------',i)
                time.sleep(0.00001)
    
    if __name__ == '__main__':
        p1 = Person_thread('xxx')
        p2 = Person_thread('qqq')
        t1 = threading.Thread(target=p1.show)
        t2 = threading.Thread(target=p2.show)
        t1.start()
        t2.start()
    View Code

    # 02 继承threading.Thread类

    import threading
    import time
    class Person_thread(threading.Thread):
        def __init__(self,name):
            threading.Thread.__init__(self)
            self.pname = name
        def show(self):
            for i in range(100):
                print(self.pname,'*******',self.name,'--------',i)
                time.sleep(0.00001)
        def run(self):
            self.show()
    
    if __name__ == '__main__':
        p1 = Person_thread('xxx')
        p2 = Person_thread('qqq')
        p1.start()
        p2.start()
    View Code
  • 相关阅读:
    机器学习中的度量——其他度量
    机器学习中的度量——相似度
    机器学习中的度量——相关系数
    机器学习中的度量——统计上的距离
    redis数据结构和常用命令
    分布式一致性算法梳理
    zookeeper集群搭建及ZAB协议
    手写RPC框架(netty+zookeeper)
    zookerper入门、核心概念和使用场景
    RabbitMQ集群部署、高可用和持久化
  • 原文地址:https://www.cnblogs.com/-nbloser/p/8513864.html
Copyright © 2011-2022 走看看