小编Fan*_*Lin的帖子

如何从外语线程调用python函数(C++)

我正在开发一个程序,使用DirectShow从媒体文件中获取音频数据.DirectShow使用线程将音频数据传递给我的程序中的回调函数,我让该回调函数调用Python中的另一个函数.

我使用Boost.Python包装我的库,回调函数:

class PythonCallback {
private:
    object m_Function;
public:
    PythonCallback(object obj)
        : m_Function(obj)
    {}

    void operator() (double time, const AudioData &data) {
        // Call the callback function in python
        m_Function(time, data);
    }

};
Run Code Online (Sandbox Code Playgroud)

问题来了,DirectShow的一个线程调用我的PythonCallback,即在Python中调用该函数.一旦调用,我的程序就崩溃了.我发现这应该是线程问题.然后我找到了这个文件:

http://docs.python.org/c-api/init.html

似乎我的程序不能直接从线程调用Python的函数,因为有Global Interpreter Lock.python的GIL非常复杂,我不知道它是如何工作的.对不起,我能做的就是问.我的问题是.在从线程调用Python函数之前和之后我应该怎么做?

它可能看起来像这样.

void operator() (double time, const AudioData &data) {
    // acquire lock
    m_Function(time, data);
    // release lock
}
Run Code Online (Sandbox Code Playgroud)

谢谢.林维克.

c++ python multithreading boost locking

4
推荐指数
1
解决办法
2053
查看次数

iOS animateWithDuration立即完成隐藏/显示甚至不透明度

我想让我的CALayer动画显示一段时间,然后淡出,这是我的代码

[_msgLayer removeAllAnimations];
[UIView animateWithDuration:10 delay:0 options:0 animations:^ {
     _msgLayer.hidden = false;
    NSLog(@"showing");
} completion:^(BOOL finished) {
    NSLog(@"showing done, finished=%d", finished);
    [UIView animateWithDuration:10 delay:40 options:0 animations:^ {
        _msgLayer.hidden = true;
    } completion:^(BOOL hideFinished) {
        NSLog(@"hiding done, finished=%d", hideFinished);
    }];
}];
Run Code Online (Sandbox Code Playgroud)

然而,动画根本无法正常工作,一切都几乎立即完成

2014-10-26 10:11:28.249 Foobar[91761:6827358] showing
2014-10-26 10:11:28.254 Foobar[91761:6827358] showing done, finished=1
2014-10-26 10:11:28.255 Foobar[91761:6827358] hiding done, finished=1
Run Code Online (Sandbox Code Playgroud)

我看到一些类似的问题,有些人说hidden不可动画,但文件说它是可动画的.我也试过opacity,然后同样的结果,动画仍然立即完成.这是为什么?我该如何解决?

_msgLayer是我自己的类继承CALayer的,它有自己的绘画方法.这个动画是从网络事件中调用的,就像服务器向iPhone发送消息一样,然后我在屏幕上显示消息.

core-animation ios

4
推荐指数
1
解决办法
888
查看次数

SELECT FOR UPDATE的奇怪死锁PostgreSQL死锁问题

我正在构建一个基于PostgreSQL的锁定系统,我有两种方法,acquire并且release.

因为acquire,它的工作原理如下

BEGIN
while True:
    SELECT id FROM my_locks WHERE locked = false AND id = '<NAME>' FOR UPDATE
    if no rows return:
        continue
    UPDATE my_locks SET locked = true WHERE id = '<NAME>'
    COMMIT
    break
Run Code Online (Sandbox Code Playgroud)

并为 release

BEGIN
UPDATE my_locks SET locked = false WHERE id = '<NAME>'
COMMIT
Run Code Online (Sandbox Code Playgroud)

这看起来非常简单,但它不起作用.奇怪的是,我想

SELECT id FROM my_locks WHERE locked = false AND id = '<NAME>' FOR UPDATE
Run Code Online (Sandbox Code Playgroud)

应该只对收购目标行锁只有在目标行的lockedfalse.但实际上,它不是那样的.不知何故,即使没有locked = false行存在,它仍然会获得锁定.结果,我遇到了死锁问题.看起来像这样 …

sql database postgresql deadlock transactions

4
推荐指数
1
解决办法
2522
查看次数

如何断言Elixir消息按顺序到达

我正在构建一个以特定顺序发送消息的Elixir模块.我写了这样的单元测试

MyModule.send_msgs(self())
assert_received {:event, 1}
assert_received {:event, 2}
assert_received {:event, 3}
Run Code Online (Sandbox Code Playgroud)

问题是,即使我改变assert_received顺序,测试仍然通过.

MyModule.send_msgs(self())
assert_received {:event, 2}
assert_received {:event, 1}
assert_received {:event, 3}
Run Code Online (Sandbox Code Playgroud)

似乎assert_received并不关心消息到达的顺序.不仅如此assert_received,据我记忆,receive也可能无法收到消息.所以,我的问题是,如果无法收到消息,您如何确保到达消息的顺序?

elixir

4
推荐指数
1
解决办法
565
查看次数

如何清理mercurial变更集中的机密数据?

我想出售我的系统副本,需要将源代码传输给我的客户.我使用Mercurial作为VCS.我的代码中有一些机密数据.例如,Amazon访问密钥/ secert密钥,数据库密码和ssl私钥.这些密钥写在代码或配置文件中,如下所示:

# settings of Amazon S3 storage
s3.storages:
    access_key: <secret>
    secret_key: <secret>
Run Code Online (Sandbox Code Playgroud)

在我将代码传输给他们之前,我需要清除代码库中的所有机密数据.但所有这些都在历史上(变更集).有了Mercurial,我该如何清理这些秘密?

mercurial history changeset

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

Swift字符串索引将"\ r \n"组合为一个char而不是两个

我正在处理包含\r\nSwift 4.2的字符串.我遇到了一些Swift索引的奇怪行为,它看起来\r\n会被Swift索引方法视为一个字符而不是两个字符.我写了一段代码来表达这种行为:

var text = "ABC\r\n\r\nDEF"

func printChar(_ lower: Int, _ upper: Int) {
    let start = text.index(text.startIndex, offsetBy: lower)
    let end = text.index(text.startIndex, offsetBy: upper)
    print("\"" + text[start..<end] + "\"")
}

printChar(0, 1) // "A"
printChar(1, 2) // "B"
printChar(2, 3) // "C"
printChar(3, 4) // new line
printChar(4, 5) // new line (okay, what's going on here?)
printChar(5, 6) // "D"
printChar(6, 7) // "E"
printChar(7, 8) // "F"
Run Code Online (Sandbox Code Playgroud)

打印结果将是

"A"
"B"
"C"
" …
Run Code Online (Sandbox Code Playgroud)

string swift swift4

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

ACL和符号链接问题

我正在设置一个 nginx 服务器。我创建一个用户 nginx 来运行服务器。我在另一个用户胜利者的家里有一些数据。我尝试设置ACL让nginx读取这些数据;这就是我所做的。

数据的位置:

/home/victor/web/folder/folder2/folder3/data
Run Code Online (Sandbox Code Playgroud)

我想让 nginx 读取这些文件,以便我创建一个文件夹

/home/victor/webshare/
Run Code Online (Sandbox Code Playgroud)

我在 victor 文件夹上设置了 ACL

# file: victor
# owner: victor
# group: victor
user::rwx
user:nginx:--x
group::---
mask::--x
other::---
Run Code Online (Sandbox Code Playgroud)

我不想让 nginx 看到 victor 文件夹下的其他内容,所以我将其设置为仅执行。我还在网络共享上设置了 ACL

# file: webshare
# owner: victor
# group: victor
user::rwx
user:nginx:r-x
group::---
mask::--x
other::---
Run Code Online (Sandbox Code Playgroud)

现在,我可以ls/home/victor/webshare/

[nginx@ home]#ls victor/webshare
hello  static
Run Code Online (Sandbox Code Playgroud)

为了让 nginx 访问 data 中的文件,我创建了一个静态符号链接。

ln -s /home/victor/web/folder/folder2/folder3/data static
Run Code Online (Sandbox Code Playgroud)

我还设置了 ACL,让 nginx 可以访问数据文件夹;然而,它不起作用。

[nginx@ home]#ls victor/webshare/static
ls: victor/webshare/static: Permission denied
Run Code Online (Sandbox Code Playgroud)

为什么nginx帐户无法读取静态符号链接?如何在不暴露其他重要数据的情况下将数据暴露给 nginx?

linux permissions acl

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

如何获得wifi热点的位置?

我想写一个应用程序,它可以记录我们正在访问的wifi热点位置并在地图中显示它们.但问题是 - 如何获得wifi热点的位置?我想我可以使用wifi信号来获取wifi热点的位置,但第一次可能不是很准确.如果没有其他解决方案,我可以在第一次访问wifi热点时记录GPS的位置.

gps android location wifi

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

类型“错误”被限制为非协议类型,即使该类型是协议

我试图将ReactiveCocoa的SignalType扩展到一个将导致约束错误的位置扩展到自定义ErrorType的地方,代码如下所示

enum MyError: ErrorType {
    // .. cases
}

extension SignalType where Error: MyError {
    // my exetensions her
}
Run Code Online (Sandbox Code Playgroud)

但是我一直这样出错

Type 'Error' constrained to non-protocol type 'MyError'
Run Code Online (Sandbox Code Playgroud)

如果您看一下ErrorType定义,这真的很奇怪

public protocol ErrorType {
}
Run Code Online (Sandbox Code Playgroud)

由于它是一个协议,那么为什么编译器会抱怨它是一个non-protocol类型,有什么想法?

reactive-cocoa swift2

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

我应该如何构建MongoDB的数据模式?

我有一个聊天室系统,我想使用MongoDB作为后端数据库.以下是实体:

  • 房间 - 聊天室(room_id)
  • 用户 - 聊天室中的聊天用户(room_id,user_name)
  • 消息 - 聊天室中的消息(room_id,user_name,message)

为了设计模式,我有一些想法:首先,3个集合 - 房间,用户和消息 - 并且在用户和消息文档中有一个父引用.

另一个想法是为每个房间创建集合.如

  • db.chatroom.victor
    • db.chatroom.victor.users
    • db.chatroom.victor.msgs
  • db.chatroom.john
    • db.chatroom.john.users
    • db.chatroom.john.msgs
  • db.chatroom.tom
    • db.chatroom.tom.users
    • db.chatroom.tom.msgs

...

我想如果我可以将文档划分为不同的集合,那么查询会更有效.此外,我可以使用上限集合来限制每个房间中的消息数量.但是,我不熟悉MongoDB.我不确定这样做是否有任何副作用,或者是否存在创建大量集合的性能问题?是否有设计MongoDB架构的指南?

谢谢.

schema mongodb

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

如何提供安全模板供用户使用python进行修改?

我正在构建一个多用户网络应用程序。每个用户都可以在我的应用程序下拥有自己的网站。我正在考虑如何允许用户修改模板而不存在安全问题?我评估了一些 python 模板引擎。例如,genshi,它是一个非常出色的模板引擎,但是允许用户修改genshi模板可能是危险的。它的语法如下:

<?python

?>
Run Code Online (Sandbox Code Playgroud)

这个语法允许你运行任何你想要 python 能做的事情。我注意到它似乎可以通过传递一些参数来关闭。但仍然存在很多潜在的问题。例如,用户可以访问内置函数和传递变量的方法。例如,如果我将 ORM 对象传递给模板。它可能包含一些我不想让用户触摸它的方法和变量。可能会喜欢这样:

site.metadata.connection.execute("drop table xxx")
Run Code Online (Sandbox Code Playgroud)

所以我的问题是如何允许用户修改其网站的模板而不出现安全问题?任何Python模板引擎都可以使用。

谢谢。

python templates web

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