【问题标题】:Non blocking Twisted xmlrpc非阻塞 Twisted xmlrpc
【发布时间】:2014-03-14 09:56:23
【问题描述】:

我想创建带有非阻塞扭曲的 xmlrpc,但我不知道。 我想在 xmlrpc 中调用方法,并且每次都从任何客户端执行我的方法,而无需等待。 这是我的代码:

from pymongo import MongoClient, ASCENDING, Connection, DESCENDING
from datetime import datetime, timedelta

from twisted.web import xmlrpc, server
import csv
import time

class MongoTest(xmlrpc.XMLRPC):
    allowNone = True
    useDateTime = True

    def __init__(self):
        xmlrpc.XMLRPC.__init__(self)
        self.dir = '/home/pythonu/Desktop/check.csv'
        self.dir_json = '/home/pythonu/Desktop/check.json'
        self.Dict = {}

    def GetTime(self, secs):
        """
            this is convert function from secs to strftime format
            pass your secs to this func for converting to strftime("%H:%M:%S")
        """

        c = ":"
        sec = timedelta(seconds=int(secs))
        d = datetime(1,1,1) + sec
        val = "%s:%s:%s" % (d.hour, d.minute, d.second)

    def xmlrpc_BulkToMongo(self, name_db, name_col, number):
        """
            added records by bulking insert
        """
        self.start = time.time()
        client = MongoClient()
        db = client[str(name_db)]
        db_col = db[str(name_col)]
        list_bulk = []

        with open(self.dir) as f:
            Dict = csv.DictReader(f)
            i = 0
            for doc in Dict:
                i += 1
                list_bulk.append(doc)
                if float(i % int(number)) == 0:
                    db.db_col.insert(list_bulk)
                    list_bulk = []
                    now = time.time() - self.start
                    now_time = self.GetTime(now)
                    print "\r%s records added by Bulking in my db after %s time\n " % (i,now_time)
        now = time.time() - self.start
        now_time = self.GetTime(now)
        print "\r%s records added by Bulking in my db after %s time\n " % (i,now_time)
        return "bulking %s records in %s time" % (i, now_time)

if __name__ == "__main__":
    from twisted.internet import reactor
    r = MongoTest()
    reactor.listenTCP(7081, server.Site(r))
    reactor.run()

如何不阻塞此代码,如下所示:

from twisted.web import xmlrpc, server
from twisted.internet import reactor
from twisted.internet.threads import deferToThread
from twisted.python import log
from twisted.internet.defer import Deferred

class Example(xmlrpc.XMLRPC):
    """An example object to be published."""

    def xmlrpc_echo(self, x):
        """Return all passed args."""
        return x

    def xmlrpc_block(self, duration=10):
        """block the instance for a specified duration"""   
        print "start"
        import time
        time.sleep(duration)
        return "i slept %s seconds!" % (str(duration))


    def xmlrpc_block2(self, duration=10):
        """block the instance for a specified duration"""
        print "start2"
        import time
        d = deferToThread(time.sleep, duration)
        d.addCallback(lambda r: "i slept %d seconds!" % duration)
        return d

    def xmlrpc_block3(self, duration=10):
        """block the instance for a specified duration"""
        import time
        d = Deferred()
        reactor.callLater(duration, d.callback, "i slept %d seconds!" % duration)
        return d
# this only runs if the module was *not* imported
if __name__ == '__main__':
    r = Example()
    reactor.listenTCP(7080, server.Site(r))
    reactor.run()

【问题讨论】:

  • “但我不知道”——你不知道什么?
  • "如何不阻塞此代码,如下所示:" - 此示例中唯一的阻塞是 time.sleep,并且示例已经包含 不 阻止。
  • 我班上的一些方法要花很长时间才能完成,因为这个原因不是异步的。我每次都调用我的方法,并且一旦执行。
  • 是的,time.sleep(duration) 块。请改用reactor.callLater(如xmlrpc_block3 - 在您的示例中不会阻塞)。
  • 我想不阻塞我的 xmlrpc_BulkToMongo 方法。我不知道如何在以后调用时不阻塞。

标签: python asynchronous twisted nonblocking xmlrpclib


【解决方案1】:

听起来你可能想看看txmongo

【讨论】:

  • near,但我想不阻塞我的 xmlrpc_BulkToMongo 方法。当我从客户端调用此方法时,大约需要 3 分钟才能完成将 400 万条记录插入数据库,但在完成此方法之前,我不会从其他客户端调用此方法。如何解决我的问题?
  • 我想用twisted在webservice中为mongodb编写驱动程序。我把项目放在了 githup 中。请检查一下link
  • 我找到了我的问题。我使用 deferToThread 来异步我的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-24
  • 1970-01-01
  • 2010-12-15
  • 2016-07-06
  • 1970-01-01
相关资源
最近更新 更多