0

存在哪些库可以为 Python 中的并发提供更高级别的接口?我并不希望一定要使用多个内核——如果 GIL 序列化所有内容,那对我来说没问题。我只想要一个更平滑/更高级别的并发接口。

我的应用程序正在为我们的软件编写测试,有时我想运行几个模拟用户,以及对后端进行更改的代码,所有这些都是并行的。如果我可以做这样的事情,那就太好了:

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)

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

我知道这不会那么简单,但是有没有什么东西可以让编写函数、启动线程、加入它们等工作变得乏味?

4

2 回答 2

1

除了threading模块之外,您还应该查看concurrent.futures模块(对于 py2 有一个backport)。

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

于 2013-05-17T20:54:10.963 回答
0

如果您只想隐藏创建线程和设置参数的复杂性,请创建一个简单的装饰器并将其用于您的功能:

异步.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()

这只是一个非常简单的函数包装器,它创建一个新线程并在线程中执行函数。如果您愿意,您可以轻松地将其调整为使用进程而不是线程。

主要.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

于 2013-05-17T20:41:24.257 回答