python 多线程

本人用的是window系统,所以就基于Windows系统来讲解python多线程的问题。

参考资料:廖雪峰的官方网站

多线程是指在按个进程内开启多个线程。python提供了两个模块来实现多线程,分别为 _thread 以及 threading。其中 _thread为低级模块,而threading为高级模块,大多数情况下我们只是用threading模块就可以完成绝大部分的功能。

启动一个线程就是将你创建的一个函数方法传入并创建 thread 实例,然后调用 start()方法,使用 join() 方法(跟多进程的步骤差不多)即可。下面让我们看一个例子:

import time
import threading

def Solution():
    print("现在正在运行的进程是:{0}".format(threading.current_thread().name))
    for i in range(1,5):
        print("现在{0}正在计数:{1}".format(threading.current_thread().name, i))
        time.sleep(1)
    print("现在{0}正在结束运行".format(threading.current_thread().name))

if __name__ == "__main__":
    print("现在主程序{0}正在运行".format(threading.current_thread().name))
    t = threading.Thread(target=Solution, name="进程1")
    t.start()
    t.join()
    print("主进程{0}正在停止运行".format(threading.current_thread().name))

然后看一下运行的结果:

现在主程序MainThread正在运行
现在正在运行的进程是:进程1
现在进程1正在计数:1
现在进程1正在计数:2
现在进程1正在计数:3
现在进程1正在计数:4
现在进程1正在结束运行
主进程MainThread正在停止运行

 现在我们来分析一下整个代码:

  • 首先我们需要导入需要用到的模块, 其中 time 模块主要是用于休眠计数、threading 模块主要用于创建新的线程
  • 现在来看一下我们创建的  Solution  方法:首先需要打印是哪一个子线程在运行(threading.current_thread().name)为获取当前线程名称的操作;接着使用  for  循环来进行计数,time.sleep(1) 为沉睡一秒钟。等计数完成之后再打印子线程结束
  • 主程序:首先需要打印主线程的名称;然后利用 Thread(target,name)来创建一个新的子线程,target 为你需要调用的方法的名称, name 为你给子进程起得名字,如果没有,那么系统就会自己给进程起名字。接下来就很多进程一样了,调用 方法 start()跟方法  join()。

LOCK  锁

多线程跟多进程最大的不同之处在于,多进程之间的数据操作互不影响,而在多线程中,所有变量由全体变量共享。这种机制有利有弊,利是你可以不用担心多线程之间的通讯问题;弊是你必须要保证你在处理某个变量的同时没有其他变量来同时操作这个变量。这样就需要一个锁 Lock 来锁定某个变量。当我们在操作真个变量的时候,就让你需要的线程来获得这个锁,只有拥有了这把锁你才有资格来更改变量,而其他没有锁的线程不能操作。只有放你释放了这把锁,其他获得这把锁的线程才能继续操作。这样就保证了,在同一阶段只能有一个子线程来操作同一个变量。创建一个锁就是通过  threading.Lock()  来实现:

import time, threading
balance = 0
lock = threading.Lock()
def change_it(n):
    # 先存后取,结果应该为0:
    global balance
    balance = balance + n
    balance = balance - n

def run_thread(n):
    for i in range(100000):
        lock.acquire()
        try:
            change_it(n)
        finally:
            # 改完了一定要释放锁:
            lock.release()
t1 = threading.Thread(target=run_thread, args=(5,))
t2 = threading.Thread(target=run_thread, args=(8,))
t1.start()
t2.start()
t1.join()
t2.join()
print(balance)

现在我们来分析一下代码:

  •  首先导入我们需要的模块,定义一个变量 balance = 0,定义一个锁 lock
  • 创建一个函数 change_it()用来先加后减,按理说结果应该为0。
  • 创建一个run_thread()函数,用来进行加锁处理:首先利用 for 循环,循环调用100000 次,在循环里面请求     acquire()一个锁,利用  try 来调用change_it()函数,finally 来释放锁lock
  • t1 、t2 分别创建一个子线程,接着运行

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值