相关疑难解决方法(0)

什么是Python中的"线程本地存储",为什么需要它?

特别是在Python中,如何在线程之间共享变量?

虽然我之前使用threading.Thread过,但我从未真正理解或看到变量如何共享的例子.它们是在主线和孩子之间共享还是仅在孩子之间共享?我什么时候需要使用线程本地存储来避免这种共享?

我已经看到很多关于通过使用锁来同步线程间共享数据访问的警告,但我还没有看到问题的一个很好的例子.

提前致谢!

python multithreading thread-local

91
推荐指数
3
解决办法
5万
查看次数

在 Python 中记录到线程特定的和共享的日志文件

我想使用 Python 的logging模块在多线程 Python 应用程序中实现每线程日志记录。我在主模块(创建线程)中的记录器名称中附加了一个唯一的 ID:

mylogger = logging.getLogger(str(someInt) + __name__)
Run Code Online (Sandbox Code Playgroud)

该模块使用多个也支持日志记录的模块,但它们的记录器初始化如下:

mylogger = logging.getLogger(__name__)
Run Code Online (Sandbox Code Playgroud)

由于被调用者类看不到调用者的记录器,调用者的日志是线程特定的,但被调用者的日志根据其路径放在一个全局文件中。

我们可以做些什么来避免更改传递str(someInt)给每个其他模块并保持不变地使用它们,但仍然记录到特定于线程的文件?

python logging multithreading

7
推荐指数
2
解决办法
1万
查看次数

在Python中确定特定函数是否在堆栈上的有效方法

对于调试,通常有用的是判断特定函数是否在调用堆栈中更高.例如,我们通常只想在某个函数调用我们时运行调试代码.

一种解决方案是检查更高的所有堆栈条目,但这是在堆栈深处并重复调用的函数中,这会导致过多的开销.问题是找到一种方法,允许我们以合理有效的方式确定特定函数是否在调用堆栈上更高.

类似

python callstack

5
推荐指数
1
解决办法
3775
查看次数

python是否允许我在运行时将动态变量传递给装饰器?

我正在尝试在工作中集成一个非常旧的系统和一个更新的系统.我能做的最好的事情就是利用系统使用的RSS消防站类型的饲料.目标是使用此RSS源使其他系统在某些人执行操作时执行某些操作.

我的想法是围绕某些函数包装装饰器,以检查用户(RSS提要中提供的用户ID)是否在新系统中具有权限.

我当前的解决方案有很多看起来像这样的函数,它们基于actionfeed中的字段调用:

actions_dict = {
    ...
    'action1': function1
}

actions_dict[RSSFEED['action_taken']](RSSFEED['user_id'])

def function1(user_id):
    if has_permissions(user_id):
         # Do this function
Run Code Online (Sandbox Code Playgroud)

我想创建一个has_permissions装饰器,user_id以便我可以删除has_permissions每个函数中的冗余检查.

@has_permissions(user_id)
def function1():
    # Do this function
Run Code Online (Sandbox Code Playgroud)

不幸的是,我不知道如何编写这样的装饰器.我看到的所有教程都有一个@has_permissions()带有硬编码值的行,但在我的情况下,它需要在运行时传递,并且每次调用函数时都会有所不同.

我该如何实现此功能?

python decorator python-decorators

3
推荐指数
1
解决办法
3084
查看次数

python中多线程应用程序中的分段错误错误

我在python中有一个多线程应用程序,其中我创建了多个生产者线程,并从数据库中提取数据.数据以块的形式提取.因此,线程创建带有限制值的sql语句的部分将保持在锁定状态.为了让线程同时执行查询,query()函数保持在锁外.然后,结果获取部分再次保持在锁定之下.以下是代码段:

with UserAgent.lock:
    sqlGeoTarget = "call sp_ax_ari_select_user_agent_list('0'," + str(self.chunkStart) + "," + str(self.chunkSize) + ",1);"
    self.chunkStart += self.chunkSize

self.dbObj.query(sqlGeoTarget)
print "query executed. Processing data now..."+sqlGeoTarget

with UserAgent.lock:
    result = self.dbObj.fetchAll()
    self.dbObj.dbCursor.close()
Run Code Online (Sandbox Code Playgroud)

但是这段代码会产生致命的错误segmentation fault (core dumped).因为如果我将所有代码置于锁定状态,它就可以正常执行.我在获取数据后显式关闭游标,当query()函数再次触发时重新打开它.

此代码位于名为的类中UserAgent,它是名为的类的共享资源Producer.因此,共享数据库对象.所以问题区域99%必须是因为db对象被共享同时命中查询并且关闭游标然后必须弄乱结果集.但那么如何解决这个问题并实现并发数据库查询执行?

python multithreading mysql-python

0
推荐指数
1
解决办法
2567
查看次数