小编Vyk*_*tor的帖子

手动调用__enter__和__exit__

我用谷歌搜索calling __enter__ manually但没有运气.因此,让我们假设我有MySQL连接器类,它使用__enter____exit__函数(最初与with语句一起使用)来连接/断开数据库.

让我们有一个使用其中2个连接的类(例如用于数据同步).注意:这不是我现实生活中的情景,但它似乎是最简单的例子.

使这一切协同工作的最简单方法是这样的类:

class DataSync(object):

    def __init__(self):
        self.master_connection = MySQLConnection(param_set_1)
        self.slave_connection = MySQLConnection(param_set_2)

    def __enter__(self):
            self.master_connection.__enter__()
            self.slave_connection.__enter__()
            return self

    def __exit__(self, exc_type, exc, traceback):
            self.master_connection.__exit__(exc_type, exc, traceback)
            self.slave_connection.__exit__(exc_type, exc, traceback)

    # Some real operation functions

# Simple usage example
with DataSync() as sync:
    records = sync.master_connection.fetch_records()
    sync.slave_connection.push_records(records)
Run Code Online (Sandbox Code Playgroud)

:这样调用__enter__/ __exit__手动是否可以(有什么不对)吗?

Pylint 1.1.0没有对此发出任何警告,也没有找到任何关于它的文章(在开始的谷歌链接).

那叫什么呢:

try:
    # Db query
except MySQL.ServerDisconnectedException:
    self.master_connection.__exit__(None, None, None)
    self.master_connection.__enter__() …
Run Code Online (Sandbox Code Playgroud)

python contextmanager python-3.x

22
推荐指数
3
解决办法
7080
查看次数

什么是阻止人们复制源代码的好方法?

我有很多自定义的javascript和布局设计,我想阻止人们使用它们.有没有任何实用的方法来做到这一点,或者我基本上只是要高兴我的PHP代码不显示?我想至少让复制我的网站变得困难.

html javascript css

15
推荐指数
7
解决办法
6395
查看次数

调用close()后,大文件没有立即刷新到磁盘?

我用我的python脚本创建大文件(1GB实际上有8个).在我创建它们之后,我必须创建将使用这些文件的进程.

该脚本如下所示:

# This is more complex function, but it basically does this:
def use_file():
    subprocess.call(['C:\\use_file', 'C:\\foo.txt']);


f = open( 'C:\\foo.txt', 'wb')
for i in 10000:
    f.write( one_MB_chunk)
f.flush()
os.fsync( f.fileno())
f.close()

time.sleep(5) # With this line added it just works fine

t = threading.Thread( target=use_file)
t.start()
Run Code Online (Sandbox Code Playgroud)

但应用程序use_file行为foo.txt是空的.有一些奇怪的事情发生了:

  • 如果我C:\use_file C:\foo.txt在控制台中执行(脚本完成后),我得到正确的结果
  • 如果我use_file()在另一个python控制台中手动执行,我得到正确的结果
  • C:\foo.txtopen()被调用后立即在磁盘上可见,但0B在脚本结束之前一直保持大小
  • 如果我添加time.sleep(5)它只是按预期开始工作(或者更确切地说是必需的)

我已经发现:

  • os.fsync()但它似乎没有工作(从结果use_file作为是否C:\foo.txt是空的)
  • 使用buffering=(1<<20)(打开文件时)似乎也不起作用 …

python windows io large-files python-3.x

14
推荐指数
2
解决办法
5312
查看次数

C++,如何在复制构造函数中正确复制std :: vector <Class*>?

我正在使用这两个课程

// This is generic data structure containing some binary data
class A {
public:
    A();
    A(const A&);
    ~A();
}

// Main data container
class B {
public:
    B();
    B( const B&);
    ~B();
protected:
    std::vector<A *> data;
}

// Copy constructor for class b
B::B( const B& orig):data() {
    for( std::vector<A *>::const_iterator it = orig.data.begin();
        it < orig.data.end(); ++it){
        data.push_back( new A( *(*it)));
    }
}
Run Code Online (Sandbox Code Playgroud)

我想这堂课会做到这一点,但我找到了如何达到完美的目标.

首先:data() - 这是初始化空向量所需的初始化(这是编写一个好的和干净的代码的一部分)?

如何vector::iterator在复制构造函数中使用,我找到的唯一方法就是我写入代码的方法(对于复制构造函数,const应该是必需的).

仅复制矢量会复制指针值而不是整个对象?

最后新的数据初始化...有什么办法可以用较小的代码替换整个循环和/或是否有任何标准如何为包含对象指针的std :: containers编写复制构造函数

子问题:我假设使用vector<A …

c++ containers vector copy-constructor

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

如何创建特定类型但为空的列表

如何创建特定类型对象但为空的列表?是否可以?我想创建一个对象数组(该类型称为 Ghosts),稍后将包含从名为 Ghosts 的类继承的不同类型。在 C++ 中这一切都非常简单,但我不确定如何在 python 中做到这一点。我试过这样的事情:

self.arrayOfGhosts = [[Ghost() for x in xrange(100)] for x in xrange(100)]
Run Code Online (Sandbox Code Playgroud)

但它已经由对象初始化,而我不需要它,有没有办法将它初始化为 0 但有一个 Ghost 类型的列表?

如您所见,我对 python 很陌生。任何帮助将不胜感激。

python object

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

使用装饰器恢复发电机

让我们有一个具有不时失败的功能的类,但是在一些动作之后它才能完美地运行.

现实生活中的例子是Mysql Query提升,_mysql_exceptions.OperationalError: (2006, 'MySQL server has gone away')但在客户端重新连接后它可以正常工作.

我试过写这个装饰器:

def _auto_reconnect_wrapper(func):
    ''' Tries to reconnects dead connection
    '''

    def inner(self, *args, _retry=True, **kwargs):
        try:
            return func(self, *args, **kwargs)

        except Mysql.My.OperationalError as e:
            # No retry? Rethrow
            if not _retry:
                raise

            # Handle server connection errors only
            # http://dev.mysql.com/doc/refman/5.0/en/error-messages-client.html
            if (e.code < 2000) or (e.code > 2055):
                raise

            # Reconnect
            self.connection.reconnect()

        # Retry
        return inner(self, *args, _retry=False, **kwargs)
    return inner

class A(object):
    ...

    @_auto_reconnect_wrapper
    def get_data(self):
        sql = …
Run Code Online (Sandbox Code Playgroud)

python yield decorator python-3.x

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

SELECT ... FOR UPDATE来自多个线程中的一个表

我需要一些帮助SELECT FOR UPDATE(相应的LOCK IN SHARE MODE).

我有一个大约有40万条记录的表,我需要在每一行上运行两个不同的处理函数.

表结构恰如其分:

data (
    `id`,
    `mtime`,  -- When was data1 set last
    `data1`,
    `data2` DEFAULT NULL,
    `priority1`,
    `priority2`,
    PRIMARY KEY `id`,
    INDEX (`mtime`),
    FOREIGN KEY ON `data2`
)
Run Code Online (Sandbox Code Playgroud)

功能有点不同:

  • 第一个函数 - 必须在所有记录上循环运行(非常快),应该选择基于的记录priority1; 集data1mtime
  • 第二个功能 - 每个记录只需运行一次(非常慢),应根据记录选择记录priority2; 集data1mtime

它们不应该同时修改同一行,但是select可能会在它们中返回一行(priority1并且priority2具有不同的值)并且如果是这样的话,事务可以等待(并且我希望这会是它阻止的唯一情况.

我正在根据以下查询选择数据:

-- For the first function - not processed first, then the oldest,
-- the same age …
Run Code Online (Sandbox Code Playgroud)

mysql innodb transactions table-locking

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

从子进程的stdout同步异步读取

我有应用程序启动子进程stdout异步处理它.问题是异步操作需要一些时间,我希望负责进程执行的方法所有异步IO操作完成后结束.

我有这样的代码:

using System.Diagnostics;

Process process = new Process();
// ...
process.OutputDataReceived += new DataReceivedEventHandler(this.OnRecvStdOut);
process.ErrorDataReceived += new DataReceivedEventHandler(this.OnRecvStdErr);
// ...
process.Start();
process.BeginOutputReadLine();
process.BeginErrorReadLine();
// ...
process.WaitForExit();
Run Code Online (Sandbox Code Playgroud)

现在我正在寻找一种方法告诉程序等待所有IO(OnRecvStdOut)操作完成.

我虽然使用了System.Threading类中的一个,但我不确定哪个类最适合这个以及如何执行此操作,最好的方法可能是:

public void OnRecvStdOut(...)
{
    something.Increase();
    // the stuff that takes so long
    something.DecreaseAndSignal();
}
Run Code Online (Sandbox Code Playgroud)

并在主要功能:

something.WaitUntilZero();
Run Code Online (Sandbox Code Playgroud)

注:我想同时允许StdErrStdOut并行处理. Something不能依赖那个Wait会被调用的Signal,因为Increase()DecreaseAndSignal()对会在Wait发生之前被多次调用.

我想到的第二件事就是可以多次发出信号(无需处理信号)并在主函数中使用循环,如:

while( ioOperations > 0){
    something.WaitForSignal(500);
}
Run Code Online (Sandbox Code Playgroud)

编辑:当前工作解决方案: …

c# io synchronization multiple-processes

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

隐藏静态库中的函数

我正在为大型项目构建.lib静态库),我想向库的最终用户隐藏一些函数,但是我需要可以从.c库中的每个文件中调用这些函数(因此不是静态的)。

这恰好相反__declspec(dllexport),我已经找到了gcc的解决方案。

我想使用static,但是静态函数应该仅在“当前.c文件” 内部可用,因此不是这样。

换句话说:我需要一种方法来告诉Microsoft Visual C ++ 2010不要将某些函数导出到final .lib(同时使它们可用于.c项目中的所有其他文件)。

注意:我从未在整个解决方案中使用过__declspec(都不使用__attribute__( visibility)),这可能只是与构建静态库相关的一些默认设置(我无法跟踪)。

linker export static-libraries visual-studio-2010 dllexport

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

以有限的优先级启动子进程

我正在寻找一种方法如何subprocess使用低系统优先级的Pythons 模块启动进程,我已经发现:

prioritysubprocess手册中没有提到.

我已经有了似乎有效的解决方案:

self.start_low_priority =  ('cmd', '/c', 'start', '/MIN', '/LOW', '/B', '/WAIT')
Run Code Online (Sandbox Code Playgroud)

注意: 开关/B /WAIT必须按此顺序才能使用

并将其用作:

args = self.start_low_priority + ( 'foo.exe', 'bar', 'foobar')
subprocess.call( args, shell=False)
Run Code Online (Sandbox Code Playgroud)

但是这个解决方案似乎并不是正确而干净的方式,而且Process Explorer无法从这样的应用程序构建正确的"进程树"(因此您无法终止进程树).

有没有什么好的练习方式来为Windows做这个?Python没有提供任何我错过的多平台解决方案吗?

python windows subprocess python-3.x

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