SimPy: Simulating a Customer Contact Center with preemption of eMails by calls





.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ height:90px;width:728px;box-sizing:border-box;
}







0















I am trying to implement a customer contact center simulation using SimPy:




  • The ccc takes calls and Emails that are both served by the same
    resources (agents).

  • Calls have different priority levels, so that higher priority calls can jump the queue. Calls do not preempt each other though.

  • Emails not only have lower priority than calls but are also preempted by them, so that when a call comes in while a ccc agent is working on an Email, the call interrupts work on the Email.


I am struggling to find a way to implement this structure in SimPy, since I want preemption to take place only for the lowest priority processes (the Emails) – calls should not be able to preempt other calls.



SimPy offers the possibility to implement “mixed preemption”, but it is the requesting process that decides whether it wants to preempt a lower priority process. In my use case however, I would want the process in service to be able to decide over preemption, in which case I could tell Emails to allow themselves to be interrupted and calls not to…



So



import simpy


def user(name, env, res, prio, preempt):
[some code defining customer behavior]

env = simpy.Environment()
res = simpy.PreemptiveResource(env, capacity=1)
email = env.process(user('email', env, res, prio=0, preempt=False))
call_1 = env.process(user('call_1', env, res, prio=-1, preempt=True))
call_2 = env.process(user('call_2', env, res, prio=-2, preempt=True))
env.run()


doesn't do what I want, because while both calls preempt the email (which they should), call_2 also preempts call_1 (which it shouldn't).



Is there any work around that would allow implementation of my use case?
In the SimPy documentation I found this sentence, which might pertain to my situation:



“If your use-case requires a different behaviour, for example queue-jumping or valuing preemption over priorities, you can subclass PreemptiveResource and override the default behaviour.”



Unfortunately my SimPy and Python skills are not advanced enough to use this hint without an example and I could not find one anywhere during my research. So any snippet of code that achieves something similar to what I want to do here would really help me on my way.










share|improve this question































    0















    I am trying to implement a customer contact center simulation using SimPy:




    • The ccc takes calls and Emails that are both served by the same
      resources (agents).

    • Calls have different priority levels, so that higher priority calls can jump the queue. Calls do not preempt each other though.

    • Emails not only have lower priority than calls but are also preempted by them, so that when a call comes in while a ccc agent is working on an Email, the call interrupts work on the Email.


    I am struggling to find a way to implement this structure in SimPy, since I want preemption to take place only for the lowest priority processes (the Emails) – calls should not be able to preempt other calls.



    SimPy offers the possibility to implement “mixed preemption”, but it is the requesting process that decides whether it wants to preempt a lower priority process. In my use case however, I would want the process in service to be able to decide over preemption, in which case I could tell Emails to allow themselves to be interrupted and calls not to…



    So



    import simpy


    def user(name, env, res, prio, preempt):
    [some code defining customer behavior]

    env = simpy.Environment()
    res = simpy.PreemptiveResource(env, capacity=1)
    email = env.process(user('email', env, res, prio=0, preempt=False))
    call_1 = env.process(user('call_1', env, res, prio=-1, preempt=True))
    call_2 = env.process(user('call_2', env, res, prio=-2, preempt=True))
    env.run()


    doesn't do what I want, because while both calls preempt the email (which they should), call_2 also preempts call_1 (which it shouldn't).



    Is there any work around that would allow implementation of my use case?
    In the SimPy documentation I found this sentence, which might pertain to my situation:



    “If your use-case requires a different behaviour, for example queue-jumping or valuing preemption over priorities, you can subclass PreemptiveResource and override the default behaviour.”



    Unfortunately my SimPy and Python skills are not advanced enough to use this hint without an example and I could not find one anywhere during my research. So any snippet of code that achieves something similar to what I want to do here would really help me on my way.










    share|improve this question



























      0












      0








      0








      I am trying to implement a customer contact center simulation using SimPy:




      • The ccc takes calls and Emails that are both served by the same
        resources (agents).

      • Calls have different priority levels, so that higher priority calls can jump the queue. Calls do not preempt each other though.

      • Emails not only have lower priority than calls but are also preempted by them, so that when a call comes in while a ccc agent is working on an Email, the call interrupts work on the Email.


      I am struggling to find a way to implement this structure in SimPy, since I want preemption to take place only for the lowest priority processes (the Emails) – calls should not be able to preempt other calls.



      SimPy offers the possibility to implement “mixed preemption”, but it is the requesting process that decides whether it wants to preempt a lower priority process. In my use case however, I would want the process in service to be able to decide over preemption, in which case I could tell Emails to allow themselves to be interrupted and calls not to…



      So



      import simpy


      def user(name, env, res, prio, preempt):
      [some code defining customer behavior]

      env = simpy.Environment()
      res = simpy.PreemptiveResource(env, capacity=1)
      email = env.process(user('email', env, res, prio=0, preempt=False))
      call_1 = env.process(user('call_1', env, res, prio=-1, preempt=True))
      call_2 = env.process(user('call_2', env, res, prio=-2, preempt=True))
      env.run()


      doesn't do what I want, because while both calls preempt the email (which they should), call_2 also preempts call_1 (which it shouldn't).



      Is there any work around that would allow implementation of my use case?
      In the SimPy documentation I found this sentence, which might pertain to my situation:



      “If your use-case requires a different behaviour, for example queue-jumping or valuing preemption over priorities, you can subclass PreemptiveResource and override the default behaviour.”



      Unfortunately my SimPy and Python skills are not advanced enough to use this hint without an example and I could not find one anywhere during my research. So any snippet of code that achieves something similar to what I want to do here would really help me on my way.










      share|improve this question
















      I am trying to implement a customer contact center simulation using SimPy:




      • The ccc takes calls and Emails that are both served by the same
        resources (agents).

      • Calls have different priority levels, so that higher priority calls can jump the queue. Calls do not preempt each other though.

      • Emails not only have lower priority than calls but are also preempted by them, so that when a call comes in while a ccc agent is working on an Email, the call interrupts work on the Email.


      I am struggling to find a way to implement this structure in SimPy, since I want preemption to take place only for the lowest priority processes (the Emails) – calls should not be able to preempt other calls.



      SimPy offers the possibility to implement “mixed preemption”, but it is the requesting process that decides whether it wants to preempt a lower priority process. In my use case however, I would want the process in service to be able to decide over preemption, in which case I could tell Emails to allow themselves to be interrupted and calls not to…



      So



      import simpy


      def user(name, env, res, prio, preempt):
      [some code defining customer behavior]

      env = simpy.Environment()
      res = simpy.PreemptiveResource(env, capacity=1)
      email = env.process(user('email', env, res, prio=0, preempt=False))
      call_1 = env.process(user('call_1', env, res, prio=-1, preempt=True))
      call_2 = env.process(user('call_2', env, res, prio=-2, preempt=True))
      env.run()


      doesn't do what I want, because while both calls preempt the email (which they should), call_2 also preempts call_1 (which it shouldn't).



      Is there any work around that would allow implementation of my use case?
      In the SimPy documentation I found this sentence, which might pertain to my situation:



      “If your use-case requires a different behaviour, for example queue-jumping or valuing preemption over priorities, you can subclass PreemptiveResource and override the default behaviour.”



      Unfortunately my SimPy and Python skills are not advanced enough to use this hint without an example and I could not find one anywhere during my research. So any snippet of code that achieves something similar to what I want to do here would really help me on my way.







      python python-3.x simpy preemption






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 29 '18 at 12:28







      Irmintrude

















      asked Nov 26 '18 at 13:33









      IrmintrudeIrmintrude

      13




      13
























          0






          active

          oldest

          votes












          Your Answer






          StackExchange.ifUsing("editor", function () {
          StackExchange.using("externalEditor", function () {
          StackExchange.using("snippets", function () {
          StackExchange.snippets.init();
          });
          });
          }, "code-snippets");

          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "1"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });














          draft saved

          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53482253%2fsimpy-simulating-a-customer-contact-center-with-preemption-of-emails-by-calls%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          0






          active

          oldest

          votes








          0






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes
















          draft saved

          draft discarded




















































          Thanks for contributing an answer to Stack Overflow!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53482253%2fsimpy-simulating-a-customer-contact-center-with-preemption-of-emails-by-calls%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          Wiesbaden

          Marschland

          Dieringhausen