Last active
February 1, 2017 20:37
-
-
Save kidpollo/70b6d8f0c91fd98c570a72c99c38e387 to your computer and use it in GitHub Desktop.
send email fastly
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require 'mail' | |
require 'thread' | |
require 'parallel' | |
require 'benchmark' | |
Mail.defaults do | |
delivery_method :smtp, options | |
end | |
POOL_SIZE = 300 | |
# multi treaded (ish) version is the fastest of all the versions | |
def send_test_emails_tp(mailbox_accounts, email_body, n=1) | |
jobs = Queue.new | |
mailbox_accounts.each do |mailbox| | |
puts " Queueing emails from #{mailbox}" | |
n.times{|i| jobs.push({i: (i+1), mailbox: mailbox})} | |
end | |
workers = (POOL_SIZE).times.map do | |
Thread.new do | |
begin | |
while args = jobs.pop(true) | |
Mail.deliver do | |
to args[:mailbox] | |
from "[email protected]" | |
subject "Postman Stress test email #{args[:i]} of #{n} from #{args[:mailbox]}" | |
body ("Stress Test email #{args[:i]} Body from #{args[:mailbox]} \n" + email_body) | |
end | |
print '.' | |
end | |
rescue ThreadError | |
end | |
end | |
end | |
workers.map(&:join) | |
puts ' Done' | |
end | |
# send n emails to mailbox accounts with email_body | |
def send_test_emails(mailbox_accounts, email_body, n=1) | |
mailbox_accounts.each do |mailbox| | |
puts " Sending Test emails for Mailbox: #{mailbox}" | |
(1..n).each do |i| | |
Mail.deliver do | |
to mailbox | |
from "[email protected]" | |
subject "Postman Stress test email #{i} from #{mailbox}" | |
body ("Stress Test email #{i} Body from #{mailbox} \n" + email_body) | |
end | |
print '.' | |
end | |
end | |
puts ' Done' | |
end | |
PROCESS_COUNT = 2 | |
# multi process | |
def send_test_emails_mp(mailbox_accounts, email_body, n=1) | |
mb = mailbox_accounts.map do |mailbox| | |
puts " Queueing emails from #{mailbox}" | |
(0..(n-1)).map{|i| {i: (i+1), mailbox: mailbox}} | |
end.flatten | |
Parallel.each(mb, in_processes: PROCESS_COUNT) {|args| | |
Mail.deliver do | |
to args[:mailbox] | |
from "[email protected]" | |
subject "Stress test email #{args[:i]} of #{n} from #{args[:mailbox]}" | |
body ("Stress Test email #{args[:i]} Body from #{args[:mailbox]} \n" + email_body) | |
end | |
print '.' | |
} | |
end | |
# multi process thread-pool | |
def send_test_emails_mp_tp(mailbox_accounts, email_body, n=1) | |
Parallel.each(mailbox_accounts.each_slice((mailbox_accounts.count/PROCESS_COUNT)).to_a, in_processes: PROCESS_COUNT) {|batch| | |
send_test_emails_tp(batch, email_body, n) | |
} | |
end | |
# Benchmark.measure { send_test_emails_tp(mailbox_accounts, email_body, 101) } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment