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

 

posted @ 2018-03-06 13:28  Alos403  阅读(274)  评论(0编辑  收藏  举报