python多线程编程

线程模块

本文主要学习的线程模块是在 python3.7 版本环境中的 threading 模块,不涉及另外的一个线程模块 _thread。

线程模块中的属性和方法

 import threading
dir(threading) # 下面列表为返回数据
['Barrier', 'BoundedSemaphore', 'BrokenBarrierError', 'Condition', 'Event', 'Lock', 'RLock', 'Semaphore', 'TIMEOUT_MAX', 'Thread', 'ThreadError', 'Timer', 'WeakSet', '_CRLock', '_DummyThread', '_MainThread', '_PyRLock', '_RLock', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_active', '_active_limbo_lock', '_after_fork', '_allocate_lock', '_count', '_counter', '_dangling', '_deque', '_enumerate', '_format_exc', '_islice', '_limbo', '_main_thread', '_newname', '_os', '_pickSomeNonDaemonThread', '_profile_hook', '_set_sentinel', '_shutdown', '_start_new_thread', '_sys', '_time', '_trace_hook', 'activeCount', 'active_count', 'currentThread', 'current_thread', 'enumerate', 'get_ident', 'local', 'main_thread', 'setprofile', 'settrace', 'stack_size']

常用类
threading.Thread

常用方法
threading.enumerate()
返回一个包含正在运行的线程的列表(主线程和子线程),正在运行指线程启动后、结束前,不包括启动前和终止后的线程。

threading.Thread类中方法
run方法:线程启动后,自动执行该方法

类实例方法:
start:开启线程
join:等待线程结束

线程创建

线程创建所用类为threading.Thread,有两种方法:1、直接创建,2、创建新类,继承threading.Thread类,重写run方法

代码实现1,直接创建线程

import threading
import time

def t1(t):
     for i in t:
         print(i)
         time.sleep(1)

def t2(t):
     for i in t:
         print(i)
         time.sleep(1)
 
def main():
     t11 = threading.Thread(target=t1, args=([1, 2, 3],))
     t22 = threading.Thread(target=t2, args=([4, 5, 6],))
     #print(id(t11))
     #print(id(t22))
     t11.start()
     t22.start()
     while True:
         print(threading.enumerate())
         if len(threading.enumerate()) <= 1:
             break
         time.sleep(0.5) 

if __name__ == '__main__':
    main() 

可以发现,t11和t22两个线程是同时运行(并发)的,多次执行后 发现:cpu交替执行两个线程,二者的先后顺序是不确定(随机)的,多线程可以共享全局变量

代码实现2,类继承与方法重写

import threading, time

ct = 1

class T(threading.Thread):
    def __init__(self):
        super().__init__()
    def run(self):
        global ct
        for i in range(3):
            ct = ct+1
            time.sleep(0.5)
            print(ct)


if __name__ == '__main__':
    t = T()
    t.start()
    t.join()
    print('end.')

从上面代码可以看到,join方法会等待子线程结束,再执行主线程的print方法,所以join方法可以在一定程度上 使代码顺序执行。

线程执行顺序

这里的执行顺序指的是 主线程和子线程的执行顺序。
通常情况下,主线程会等待子线程执行,当所有子线程结束后,主线程才会继续后面的操作 直到结束,也可以人为改变这个顺序,即主线程无需等待子线程结束,实现的方法是 设置守护线程。

def demo():
    for i in range(3):
        print("hello world")
        time.sleep(1)


if __name__ == '__main__':
    t = threading.Thread(target=demo)
    # 守护线程,不会等子线程结束
    t.setDaemon(True)
    t.start()
    print('end.')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值