سؤال

لقد كتبت أ جيفنتالبرنامج المستند إلى البرنامج الذي يسمح لعملائه على الويب بتبادل الرسائل بسرعة من خلاله (بحيث يعمل مثل المحور).

نظرًا لأنني أؤيد آلية الاقتراع فقط في هذه اللحظة ، فقد كتبتها لتخزين الرسائل التي يجب تسليمها إلى عميل معين في "صندوق الوارد" في جانب الخادم. بينما يتم تخزين قائمة العميل في MySQL ، يتم تخزين صناديق الوارد هذه في Memcache للوصول بشكل أسرع. عندما يتصل العميل بالمحور ، فإنه يسحب جميع الرسائل التي تراكمت في صندوق الوارد الخاص بها.

السؤال
تكمن المشكلة في أنه ذات مرة في حين أن المستلمين لا يتلقون رسائلهم عند سحب محتويات صندوق الوارد الخاص بهم - يتلقون صفيفًا فارغًا.
ما يعززني أكثر هو أنه إذا قمت بإعادة تشغيل المحور ، فإن الرسائل التي لم يتلقاها العملاء تتحقق فجأة وتسليمها إلى وجهاتهم.
هل يمكنك توجيهي إذا كان هناك عيب صارخ في الكود الخاص بي؟ هل لديك أي تفسير لهذا المعنى؟

push هي الطريقة التي يتم تنفيذها لوضع رسالة في صندوق الوارد للعميل. pull هي الطريقة التي تسترجع قائمة جميع الرسائل المتراكمة كقائمة وإعادتها إلى وظيفة المعالجة الرئيسية.

def __push(self, domain, message, tid=None):
    if tid:
        try:
            messages = self.mc.get("%s_inbox" % tid.encode('utf8'))
        except:
            logging.error("__push memcached failure", exc_info=1)
        if messages:
            messages = fromjson(messages)
            messages.append(message)
            self.mc.set("%s_inbox" % tid.encode('utf8'), tojson(messages))
            print "Pushed to", "%s_inbox" % tid.encode('utf8')


def __pull(self, tid):
    try:
        messages = self.mc.get("%s_inbox" % tid.encode('utf8'))
        if messages:
            self.mc.set("%s_inbox" % tid.encode('utf8'), "[]")
            return fromjson(messages)
        else:
            return []
    except:
        logging.error("__pull failure", exc_info=1)
        return []
هل كانت مفيدة؟

المحلول

أعتقد أنني حصلت عليه: إنه ملف حشرة في وحدة Python-memcache.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top