`
san_yun
  • 浏览: 2662451 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

python GIL-并发问题小结

 
阅读更多

参考文档:

http://www.rubyinside.com/does-the-gil-make-your-ruby-code-thread-safe-6051.html

http://www.jstorimer.com/blogs/workingwithcode/8085491-nobody-understands-the-gil

http://www.jstorimer.com/blogs/workingwithcode/8100871-nobody-understands-the-gil-part-2-implementation

http://stackoverflow.com/questions/2227169/are-python-built-in-containers-thread-safe

http://jessenoller.com/blog/2009/02/01/python-threads-and-the-global-interpreter-lock

https://wiki.python.org/moin/GlobalInterpreterLock

 

上面的TODO不是为了做thread safe的, add ability to block waiting on a connection to be released

,个人理解是connection在release的时候,其他方法被block。但是他的实现我没看懂,os.getpid()不是获取进程id吗?

 

 

pool正常调用顺序,get_conneciton(),release()

假设Thread A,B,那么可能出现的随机组合:(A.get_con,B.release),(A.get_con,B.get_con),(A.release,B.get_con),(A.release,B.release)

 

thread pool的thread safe关键点是:已经被线程A标记为使用的connection不能被B线程使用到。

如果能做到上面这点可以认为thread pool是线程安全的。

 

 

def get_connection(self):

    try:

        connection = self._available_connections.pop()

    except IndexError:

        connection = self._make_connection()

 

    if connection and connection.connect():

        self._in_use_connections.add(connection)

        return connection

    else:

        return None

 

def _make_connection(self):

    "Create a new connection"

    if self._created_connections >= self._max_connections:

        raise DbossError("Too many connections")

 

    conn = Connection(self,self.location,self.timeout)

    self._created_connections += 1

    return conn

 

_available_connection有元素的情况:

如果_available_connection.pop()被线程A调用后,被线程B调用,线程B是否会得到和线程A一样的connection?这个是python的set来保证,据我所知,set是保证。

 

_available_connection没有元素的情况:

如果_available_connection.pop()被线程A调用后,被线程B调用,这个时候会触发IndexError,进入_make_connection。这里有两种情况:

1. 线程A已经执行完_make_connection(),线程B调用self._available_connections.pop()。

2. 线程A在_make_connection()执行过程中,线程B调用self._available_connections.pop()。

 

可以发现上述两种情况线程B都会触发IndexError异常,对结果没有影响。

 

 

 

分享到:
评论

相关推荐

    python-3.6.7-docs-pdf-a4

    9. **并发和多线程**:讨论线程、进程以及GIL(全局解释器锁)对Python并发的影响。 10. **高级主题**:如装饰器、元类、上下文管理器等,这些是Python中的高级特性,可以增强代码的灵活性和可维护性。 11. **标准...

    Python-aiochan一个Python下的并发库

    在Python的世界里,异步编程是解决高并发问题的关键,而aiochan正是为此目的而生。这个库是基于Python的asyncio框架构建的,旨在提升异步代码的可读性和可维护性。 1. **异步编程基础**:异步编程是一种非阻塞I/O...

    Python高级-全部(html版).rar

    Python的`pymysql`或`mysql-connector-python`库允许你与MySQL数据库进行交互。通过它们,你可以执行SQL查询、插入数据、更新记录、删除记录等,是构建数据库驱动的应用程序必不可少的工具。 六、Web通讯 Python在...

    python-3.6.6-amd64.exe.zip

    此外,新的线程本地存储(TLS)功能改进了多线程环境中的性能,尤其是在全局解释器锁(GIL)释放后进行并发操作的场景。 Python 3.6的另一个重要特性是增加了asyncio模块的增强,包括对异步/等待语法的支持,这使得...

    Python3资源 01-GIL-1.flv

    Python3资源 Python3资源

    Python高级-全部(html版).zip

    Python有多种库(如`pymysql`或`mysql-connector-python`)用于与MySQL数据库交互。了解如何连接数据库、执行SQL查询、处理结果集以及事务处理等,对于开发涉及数据库的Python应用程序至关重要。 6. **Web通讯**:...

    python-2.7.15.amd64

    7. **多线程支持**:虽然Python的全局解释器锁(GIL)限制了多核CPU下的并行计算,但Python 2.7依然提供了线程库来实现并发执行任务。 8. **模块化开发**:Python 2.7 支持模块化编程,方便代码组织和重用。 在...

    ant-learn-python-concurrent-main.zip

    通过学习"ant-learn-python-concurrent-main.zip"中的资源,你可以掌握如何在Python中有效地实现并发编程,解决各种并发问题,并在实践中提升代码的执行效率。无论是对初学者还是有经验的开发者来说,这都是一个宝贵...

    Python-100-Days

    10. **多线程与并发**:理解Python的GIL(全局解释器锁)和如何使用threading模块进行多线程编程。 11. **数据库操作**:学习如何使用SQLite、MySQL等数据库,并通过Python的数据库接口进行数据的增删改查操作。 ...

    Python C-API

    4. **线程与多线程支持**:Python C-API提供了对多线程的支持,但需要注意GIL(全局解释器锁)的影响。 - **应用场景**:在多线程环境中使用Python C-API时,需考虑如何避免GIL导致的性能瓶颈。 #### 四、结论 ...

    Python-Python3爬虫系列的理论验证比较同步依序下载多进程并发多线程并发和asyncio异步编程之间的效率差别

    然而,由于GIL(全局解释器锁)的存在,Python的多线程在CPU密集型任务上并不能充分利用多核资源,但在I/O密集型任务中,如爬虫,仍可以并发执行请求,提高效率。需要注意的是,线程间的同步和竞争条件也需要谨慎...

    Gil-Web-Cache-Deception-Attack-wp.zip

    标题 "Gil-Web-Cache-Deception-Attack-wp.zip" 暗示了这是一个关于Web缓存欺骗攻击的研究报告,由Gil Tene撰写。这种攻击类型主要针对Web缓存系统,利用其工作原理来实施恶意活动。Web缓存是为了提高网站加载速度和...

    Core Python Programming----Source Code

    8. **并发和多线程**:Python提供了多线程和多进程的支持,用于编写并发程序,以提高性能。书中会介绍GIL(全局解释器锁)以及如何在Python中使用线程和进程。 9. **网络编程**:Python可以用来编写网络应用程序,...

    Inside the Python GIL

    虽然GIL限制了Python程序的多线程并发能力,但有多种方法可以在一定程度上缓解这个问题: - **多进程**:利用Python的`multiprocessing`模块创建多个进程,每个进程拥有自己的Python解释器和独立的GIL。这样,不同...

    Python-北邮部分机试题整理

    14. **并发编程**:多线程、多进程的使用,了解GIL(全局解释器锁)及其对Python多线程的影响,以及异步I/O模型(如asyncio)。 15. **数据库操作**:使用SQLite或MySQL等数据库,了解SQL语言,使用Python的数据库...

    Python---源码剖析.rar

    源码剖析是深入理解Python工作机制的关键步骤,对于开发者来说,这有助于提升编程技能,优化代码效率,并解决复杂的编程问题。《Python源码剖析》这本书或资料可能包含对Python解释器、标准库以及核心语法的深入解析...

    使用进程池规避Python的GIL限制

    Python中的全局解释器锁(GIL)是一个经常被提及的特性,它对多线程的CPU密集型程序有一定的影响。要理解如何规避GIL限制,我们首先需要了解GIL是什么,以及它为何会成为性能瓶颈,之后再探讨通过进程池来绕过GIL...

    python GIL详细解释

    GIL是Python多线程编程中不可忽视的问题。由于它导致了Python无法在多核CPU上有效地并行执行多个线程,因此开发者在设计并发程序时,需要考虑到这一点。尽管如此,对于I/O密集型任务,Python的多线程仍然可以发挥很...

    let's-python-源码

    "let's-python-源码" 是一个与"let's-python"系列视频相关的代码资源集合,提供了该教程中的各种示例和练习的源代码。这个压缩包涵盖了从基础到进阶的多个Python编程主题,旨在帮助学习者提升Python编程技能。 在...

Global site tag (gtag.js) - Google Analytics