2013-05-17 31 views
0

存在哪些库可为Python中的并发提供更高级别的接口?我不打算利用多个内核 - 如果GIL将所有内容序列化,那对我来说没什么问题。我只想要一个更平滑/更高级别的并发接口。封装Python线程的库

我的应用程序正在编写我们软件的测试,有时候我想运行几个模拟用户,以及对后端进行更改的代码,并行执行。这将是巨大的,如果,比方说,我可以做这样的事情:

setup_front_end() 
setup_back_end() 
parallel: 
    while some_condition(): 
     os.system('wget http://...') 
     sleep(1) 
    for x in xrange(10): 
     os.system('top >> top.log') 
     sleep(1) 
    for x in xrange(100): 
     mess_with_backend() 

在上面的代码的想法是,我们开始3个线程,第一个运行于:

while some_condition(): 
    os.system('wget http://...') 
    sleep(1) 

第二个运行第二个循环,第三个循环运行第三个循环。

我知道这不会那么简单,但是有没有什么东西可以让苦工摆脱写作功能,旋转线程,加入它们等?

+2

'import threading' – lolopop

回答

1

除了threading模块,你也应该看看到concurrent.futures模块(用于PY2疗法是backport)。

它提供准备使用线程/进程池实现,并允许您编写高效的并行代码。由于它为线程和多处理提供了统一的API,因此您可以在需要时轻松地在两者之间进行切换。

0

如果你只想隐藏创建线程和设定参数的复杂性,创建一个简单的装饰,并用它为你的函数:

async.py:

from threading import Thread 
class async(object): 
    def __init__(self, func): 
     self.func = func 

    def __call__(self, *args, **kwargs): 
     Thread(target=self.func, args=args, kwargs=kwargs).start() 

这只是一个非常简单的包装函数,它创建一个新的Thread并执行Thread中的函数。如果你愿意,你可以很容易地使用它来使用进程而不是线程。

main.py:

import time 
from async import async 

@async 
def long_function(name, seconds_to_wait): 
    print "%s started..." % name 
    time.sleep(seconds_to_wait) 
    print "%s ended after %d seconds" % (name, seconds_to_wait) 

if __name__ == '__main__': 
    long_function("first", 3) 
    long_function("second", 4) 
    long_function("third", 5) 

@async只是装饰你的功能,你可以异步调用它。

在你的情况:在函数中只是包装的循环,并与@async装饰一番。

对于一个全功能的异步装饰一下:http://wiki.python.org/moin/PythonDecoratorLibrary#Asynchronous_Call