3

これは良いマルチスレッド パターンですか? それは機能しますが、非常に単純なので、いくつかの隠れた落とし穴があるに違いないと私は疑っています。非同期 URL フェッチのために WSGI アプリケーション内で使用したいと思います。

私はGAE Asynchronous Requestsに触発されました。

import datetime
import time
import threading

start_time = datetime.datetime.now()

def func(value):
    print 'START: {} {}'.format(value, datetime.datetime.now())
    time.sleep(5)
    print 'END: {} {}'.format(value, datetime.datetime.now())
    return str(value) * 10


class MyThread(threading.Thread):
    def __init__(self, func, args=(), kwargs={}):
        super(MyThread, self).__init__()
        self.func = func
        self.args = args
        self.kwargs = kwargs
        self.result = None

    def run(self):
        self.result = self.func(*self.args, **self.kwargs)

    def get_result(self):
        self.join()
        return self.result

def run_async(*args, **kwargs):
    t = MyThread(*args, **kwargs)
    t.start()
    return t

# This will be called inside WSGI request handler only:

t1 = run_async(func=func, args=(1,))
t2 = run_async(func=func, args=(2,))
t3 = run_async(func=func, args=(3,))

print '\n'
print 'Do other stuff...'
print '\n'

print t1.get_result()
print t2.get_result()
print t3.get_result()

print '=' * 70
print 'Duration: {}'.format(datetime.datetime.now() - start_time)

出力は次のとおりです。

START: 1 2013-02-21 16:15:51.918112
START: 2 2013-02-21 16:15:51.918642
START: 3 2013-02-21 16:15:51.919138


Do other stuff...


END: 1 2013-02-21 16:15:56.918900
1111111111
END: 2 2013-02-21 16:15:56.924068
2222222222
END: 3 2013-02-21 16:15:56.924465
3333333333
4

0 に答える 0