python多线程day1

代码环境:python3.6
1,程序:

    一堆代码以文本形式存入一个文档

2,进程:

        程序运行的一个状态

包含地址空间,内存,数据线
每个进程有自己独立的运行环境,多进程共享数据
3,线程:

        一个进程的独立运行的片段,一个进程可以由多个线程

轻量化的进程
一个进程的多个线程间共享数据和上下文运行环境
共享互斥
4,全局解释器
py代码的执行是由py虚拟机进行控制的
在主循环中只能有一个控制线程在执行
5,py包
thread 

threading

6,正常的python执行顺序的代码
import time

def loop1():
    print('start 1 at:',time.ctime())
    time.sleep(4)
    print('end 1 at:', time.ctime())

def loop2():
    print('start 2 at:',time.ctime())
    time.sleep(2)
    print('end 2 at:', time.ctime())

def main():
    print('start 3 at:', time.ctime())
    loop1()
    loop2()
    print('end 3 at:', time.ctime())

if __name__ == '__main__':
    main()
运行结果是这样的:先执行主函数打印start,然后执行loop1函数的start,运行loop1的函数体sleep4秒,接着打印end 1的时间,loop2是在loop运行结束之后开始执行的,过程和loop1一样,这是普通的python执行顺序,最后到主函数的end输出。
start 3 at: Tue Jun 19 21:29:52 2018
start 1 at: Tue Jun 19 21:29:52 2018
end 1 at: Tue Jun 19 21:29:56 2018
start 2 at: Tue Jun 19 21:29:56 2018
end 2 at: Tue Jun 19 21:29:58 2018
end 3 at: Tue Jun 19 21:29:58 2018
7,多线程的简单例子

    使用python3的_thread包,loop1和loop2是2个函数,由主函数开2个线程去调用这两个函数

import time
import _thread as thread

def loop1():
    print('start 1 at:',time.ctime())
    time.sleep(4)
    print('end 1 at:', time.ctime())

def loop2():
    print('start 2 at:',time.ctime())
    time.sleep(2)
    print('end 2 at:', time.ctime())

def main():
    # print('start 3 at:', time.ctime())
    # loop1()
    # loop2()
    # print('end 3 at:', time.ctime())

    print('start main at:', time.ctime())
    thread.start_new_thread(loop1,())
    thread.start_new_thread(loop2,())
    print('end main at:', time.ctime())

if __name__ == '__main__':
    main()
    while 1:
        time.sleep(1)

运行结果如下:我们可以看到start1和start2是同时开始执行的。这就是多线程

start main at: Tue Jun 19 21:52:56 2018
end main at: Tue Jun 19 21:52:56 2018
start 1 at: Tue Jun 19 21:52:56 2018
start 2 at: Tue Jun 19 21:52:56 2018
end 2 at: Tue Jun 19 21:52:58 2018
end 1 at: Tue Jun 19 21:53:00 2018
8,使用threading包改写上面的案例

    因为_thread已经过时了,一些功能不好用了。示例演示可以设置线程的同时传递参数。

# -*- coding: utf-8 -*-
import time
import threading

def loop1(in1):
    print('start 1 at:',time.ctime())
    print('param 1:',in1)
    time.sleep(4)
    print('end 1 at:', time.ctime())

def loop2(in1,in2):
    print('start 2 at:',time.ctime())
    print('param 2:',in1,in2)
    time.sleep(2)
    print('end 2 at:', time.ctime())

def main():
    print('start main at:', time.ctime())
    #如果只有一个参数,就一定要给个','
    t1 = threading.Thread(target=loop1,args=(1,))
    t1.start()
    # t1.join()

    t2 = threading.Thread(target=loop2, args=(2,3))
    t2.start()

    t1.join()
    t2.join()
    print('end main at:', time.ctime())

if __name__ == '__main__':
    main()

执行结果是这样的:

start main at: Tue Jun 19 23:22:25 2018
start 1 at: Tue Jun 19 23:22:25 2018
param 1: 1
start 2 at: Tue Jun 19 23:22:25 2018
param 2: 2 3
end 2 at: Tue Jun 19 23:22:27 2018
end 1 at: Tue Jun 19 23:22:29 2018
end main at: Tue Jun 19 23:22:29 2018
9,设置守护进程
 
  • 如果在线程中将子线程设置成守护线程,则子线程会在主线程结束后自动退出
  • 守护线程不允许离开主线程独立运行
  • 守护进程能否实现和环境有关

示例代码是这样的

import time
import threading

def fun():
    print('start fun')
    time.sleep(2)
    print('end fun')#子进程在执行完上一句就被kill掉了,所以这句不执行了

print('start main')

t = threading.Thread(target=fun,args=())
t.setDaemon(True)#需要在启动前将他设置成守护
t.start()

time.sleep(2)
print('end main')

执行结果:因为把子进程设为了主进程的守护进程,所以当主进程休息2秒结束之后,和子进程一起结束了,所以子进程后面的print语句就不执行了

start main
start fun
end main
10,进程的一些常用属性
currentThread:当前的线程
enumerate:
activeCount:当前正在执行的线程数量
setname:设置线程名
getname:获取当前线程名字

示例代码:

import time
import threading

def loop1():
    print('start 1 at:',time.ctime())
    time.sleep(1)
    print('end 1 at:', time.ctime())

def loop2():
    print('start 2 at:',time.ctime())
    time.sleep(3)
    print('end 2 at:', time.ctime())

def loop3():
    print('start 3 at:',time.ctime())
    time.sleep(4)
    print('end 3 at:', time.ctime())

def main():
    print('start main at:', time.ctime())
    t1 = threading.Thread(target=loop1,args=())
    t1.setName('THR 1')
    t1.start()

    t2 = threading.Thread(target=loop2,args=())
    t2.setName('THR 2')
    t2.start()

    t3 = threading.Thread(target=loop3,args=())
    t3.setName('THR 3')
    t3.start()

    t1.join()
    t2.join()
    t3.join()

    time.sleep(3)
    for thr in threading.enumerate():
        print('running thread is {0}'.format(thr.getName()))
    print('the count of running threads is {0}'.format(threading.activeCount()))
    print('end main at:', time.ctime())

if __name__ == '__main__':
    main()

结果如下:

start main at: Tue Jun 19 23:34:28 2018
start 1 at: Tue Jun 19 23:34:28 2018
start 2 at: Tue Jun 19 23:34:28 2018
start 3 at: Tue Jun 19 23:34:28 2018
end 1 at: Tue Jun 19 23:34:29 2018
end 2 at: Tue Jun 19 23:34:31 2018
end 3 at: Tue Jun 19 23:34:32 2018
running thread is MainThread
the count of running threads is 1
end main at: Tue Jun 19 23:34:35 2018

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值