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;
}
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
add a comment |
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
add a comment |
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
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
python python-3.x simpy preemption
edited Nov 29 '18 at 12:28
Irmintrude
asked Nov 26 '18 at 13:33
IrmintrudeIrmintrude
13
13
add a comment |
add a comment |
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
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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