美文网首页
Python多线程

Python多线程

作者: FangHao | 来源:发表于2017-02-08 23:34 被阅读0次

threading与Lock#

Python中实现多线程的方式有Thread和threading,其中Thread过于底层,threading是将Thread封装之后的,所以使用起来更加方便。

在Python的线程中,全局变量可以被进程中的线程访问和修改,这样就会造成一种数据不安全的状态,解决的方法有1)使用while True+if判断来实现控制其他线程的执行,但是此种方式过于消耗资源。在这里使用互斥锁的方式来解决这个问题

代码如下:

#coding=utf-8
from threading import Thread,Lock
import time,os

g_num = 0

def work1():
global g_num
for i in range(1000000):
#metux.acquire()
g_num += 1
#metux.release()
print('work1',g_num)

def work2():
global g_num
for i in range(1000000):
#metux.acquire()
g_num += 1
#metux.release()
print('work2',g_num)

if __name__ == '__main__':
#metux = Lock()
t1 = Thread(target = work1)
t2 = Thread(target = work2)
t1.start()
t2.start()
t1.join()
t2.join()
print(g_num)

此段代码中注释了metux对象的部分,这样的代码执行结果会是:

因为多个线程中g_num += 1在执行的时候,由于CPU切换进程的机制会导致有一些进程此步骤没有执行完毕,但是保留了当时执行的数据状态,所以会造成部分数据没有得到正确的加合运算。

针对这种情况的解决方式一种是使用互斥锁,即将上述代码中注释的部分解除掉,执行结果如下:

其中metux = Lock()初始化一个对象,metux.acquire()来进行上锁,metux.release()来进行解锁。当代码某处使用了一个锁之后,代码在执行别处时如果再遇到这个锁的时候,就会卡顿在锁的地方不会再往下执行

threading与thread.local()方法#

使用互斥锁,虽然保护了数据安全,但是从另一方面就是将多个进程改成了单一一个进程在运行。这样并不能很好的提高多线程的效率。

在这里Python的threading中有一个ThreadLocal方法,可以创建一个全局变量,但是多个线程只能修改自己对于此全局变量的那一个部分,做到了数据保护和线程运行

代码示例如下:

#coding=utf-8
import threading

# 创建全局ThreadLocal对象:
local_school = threading.local()

def process_student():
# 获取当前线程关联的student:
std = local_school.student
print('Hello, %s (in %s)' % (std, threading.current_thread().name))

def process_thread(name):
# 绑定ThreadLocal的student:
local_school.student = name
process_student()

t1 = threading.Thread(target= process_thread, args=('dongGe',), name='Thread-A')
t2 = threading.Thread(target= process_thread, args=('老王',), name='Thread-B')
t1.start()
t2.start()
t1.join()
t2.join()

运行结果如下:

Ubuntu中查看线程的方式#

  1. ps -T -p PID

  2. top -H -p PID

相关文章

  • GIL

    谈谈python的GIL、多线程、多进程 最近在看 Python 的多线程,经常我们会听到老手说:“python下...

  • Python多线程编程——多线程编程中的加锁机制

    如果大家对Python中的多线程编程不是很了解,推荐大家阅读之前的两篇文章:Python多线程编程——多线程基础介...

  • 5-线程(补充)

    Python多线程原理与实战 目的: (1)了解python线程执行原理 (2)掌握多线程编程与线程同步 (3)了...

  • Python_提高

    GIL全局解释器锁 描述Python GIL的概念, 以及它对python多线程的影响?编写⼀个 多线程抓取⽹⻚的...

  • Python程序员都知道的入门知识の八

    目录【Python程序员都知道的入门知识】 1. 多线程threading、Queue Python的多线程由th...

  • Python多线程实现生产者消费者

    1. Python多线程介绍 Python提供了两个有关多线程的标准库,thread和threading。thre...

  • 多线程

    Python多线程原理与实战 目的: (1)了解python线程执行原理 (2)掌握多线程编程与线程同步 (3)了...

  • Python多线程(上)

    前言 说起Python的多线程,很多人都嗤之以鼻,说Python的多线程是假的多线程,没有用,或者说不好用,那本次...

  • Python 3中的多线程

    Python 3的多线程 Python 3的多线程模块threading在旧版_thread模块基础上进行了更高层...

  • Python 多线程抓取图片效率实验

    Python 多线程抓取图片效率实验 实验目的: 是学习python 多线程的工作原理,及通过抓取400张图片这种...

网友评论

      本文标题:Python多线程

      本文链接:https://www.haomeiwen.com/subject/qbobittx.html