1

Python 2.7を使用してWinxpでRedisにPythonでこのテストコードを高速化するにはどうすればよいですか?マルチプロセッシングの方が良いでしょうか?6000/sの負荷率と100,000/sの公開率。私は100,000を選択しましたが、テストでは低くなる可能性があります。このプロセスには15秒かかります。

サーバーヘルプの設定を変更しますか?

import time
from time import strftime
import redis
import threading, Queue

start_time = time.time()
cxn = redis.StrictRedis('127.0.0.1',6379,1)


class WorkerMain(threading.Thread):
    def __init__(self, queue):
        threading.Thread.__init__(self)
        self.queue = queue

    def run(self):
        while 1:
            try: # take a job from the queue            
                row  = self.queue.get_nowait()           
            except Queue.Empty: raise SystemExit

            try:
                cxn.set(row, "Row")
                #print (row, "Row")
            except: print 'Setup Error'

if __name__ == '__main__':
    connections =  5

    sml = range(1,100000)    
    queue = Queue.Queue() 
    for row in sml:
        queue.put(str(row))

    threads = []
    for dummy in range(connections):
        t = WorkerMain(queue)
        t.start()
        threads.append(t)

    # wait for all threads to finish
    for thread in threads:
        thread.join()


print 
end_time = time.time()
duration = end_time - start_time
print "Duration: %s" % duration

以下のコードをマルチプロセッシングに使用し、CLIでデータを「監視」しました...すべてのデータがサーバーに送られるわけではありません。

from multiprocessing import Pool
import time
import redis

start_time = time.time()
cxn = redis.Redis('127.0.0.1',6379,1)

def rset(var):
    cxn.set(var,"value")

if __name__ =='__main__':   
    sml = range(1,10000)
    #for x in sml:print x

    pool = Pool(processes=5)
    for row in sml:
        pool.apply_async(rset, [(row,)])
        #print result.get(), 


end_time = time.time()
duration = end_time - start_time
print "Duration: %s" % duration

これがパイプライン化されたコードです......私はスレッドのものをコメントアウトしました。

from time import strftime
import redis
import threading, Queue

start_time = time.time()
cxn = redis.StrictRedis('127.0.0.1',6379,0)
pipe = cxn.pipeline(transaction=False)

class WorkerMain(threading.Thread):
    def __init__(self, queue):
        threading.Thread.__init__(self)
        self.queue = queue

    def run(self):
        while 1:
            try: # take a job from the queue            
                row  = self.queue.get_nowait()           
            except Queue.Empty: raise SystemExit

            try:
                cxn.set(row, "Row")
                #print (row, "ROw")
            except: print 'Setup Error'

if __name__ == '__main__':
    #connections =  5

    sml = range(1,100000)    
    #queue = Queue.Queue() 
    for row in sml:
        #queue.put(str(row))
        pipe.set(str(row),"value").execute()# key, value

   # threads = []
   # for dummy in range(connections):
   #     t = WorkerMain(queue)
   #     t.start()
   #     threads.append(t)
   #     
   # # wait for all threads to finish
   # for thread in threads:
   #    thread.join()



print 
end_time = time.time()
duration = end_time - start_time
print "Duration: %s" % duration
4

2 に答える 2

2

パイプラインを使用します。パイプラインはコマンドをバッチ処理するため、ネットワーク オーバーヘッドを支払う必要はありません。

見る :

  1. ここのパイプラインに関するセクションhttps://github.com/andymccurdy/redis-py
  2. Redis.io でのパイプライン - http://redis.io/topics/pipelining
于 2012-04-17T17:37:05.620 に答える
1

cpython (標準の python インタープリター) を使用している場合、パフォーマンスを向上させるためにスレッドを使用することは、ギルのため、あまり良い考えではありません。

http://wiki.python.org/moin/GlobalInterpreterLock

マルチプロセッシングはより適切に機能するはずです

于 2012-04-17T17:21:03.853 に答える