包装Python线程的库

2024-04-20 03:22:50 发布

您现在位置:Python中文网/ 问答频道 /正文

有哪些库在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)

第二个运行第二个循环,第三个运行第三个循环。你知道吗

我知道事情不会那么简单,但是有没有什么东西可以减轻编写函数、旋转线程、连接线程等工作的负担呢?你知道吗


Tags: 代码inhttpforossetupsleepsome
2条回答

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

你知道吗异步.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

除了threading模块之外,您还应该查看^{}模块(对于py2,它是一个backport)。你知道吗

它提供了现成的线程/进程池实现,并允许您编写高效的并发代码。因为它为线程和多处理提供了统一的API,所以如果需要的话,它允许您在两者之间轻松切换。你知道吗

相关问题 更多 >