2017-07-11 10 views
1

は、私が10倍高速APIの操作を行うために使用される機能:ThreadPoolで実行された関数で電子メールメッセージを一度だけ送信する方法は?ここ

def load_url(req, id, data, timeout): 
    headers = {'Authorization': 'AT-API 111111222222333333344444445555555'} 
    r = req.post("https://service.com/api/v1/compare", headers=headers, data=data, timeout=timeout) 
    data = r.json() 
    print id 
    if data['error']: 
     print data['error'] 
    else: 
     c.execute("UPDATE offers SET valid = ? WHERE id = ?", ('valid' if data['data']['success'] else 'invalid', id)) 
     print data['data']['success'] 
     print data['data']['count'] 
    return r.json() 


if __name__ == '__main__': 
    ... 
    with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor: 
     future_to_url = {executor.submit(load_url, s, data['id'], data, 120): data for data in datas} 
     for future in concurrent.futures.as_completed(future_to_url): 
      url = future_to_url[future] 
      try: 
       data = future.result() 

我々は定期的に4時間ごとにこのスクリプトを実行しています。 load_urlでは、リクエストのステータスを表示して確認します。data ['data'] ['count'] - 1か月間の通話量です。私は、5000コール以下に達した後で電子メール通知を送信したいと思います。送信するメッセージは1つしか実装しませんが、5ではなく50を実装する方法は?私たちはSqlite3を使ってデータを保存しています。

私たちは、電子メールを送信するためMailgunを使用している:

def send_simple_message(email_list): 
    for email in email_list: 
     response = requests.post(
      "https://api.mailgun.net/v3/newsletter.company.com", 
      auth=("api", "key-1234567"), 
      data={"from": "Mailgun Sandbox <[email protected]>", 
       "to": email, 
       "subject": "Agent - we reached the limit by API", 
       "html": "We reached the limit for agent" }) 

答えて

1

をあなたはsend_simple_message機能を実行してから、複数のスレッドを防ぐためにロック機構を使用して、メールがあったか否かを追跡し、同期値を設定することができます送信されたかどうか。

import threading 
lock = threading.Lock() 
has_been_sent = False 

# then in your load_url function you could do something like 
if condition on count: 
    with lock: 
     if not has_beend_sent: 
      # send mail 
      has_been_sent = True 
+0

私たちはこのスクリプトを4時間ごとに定期的に実行しています。その前に送信されたことを覚えておく必要があります。 – paus

+0

と、それはconcurrent.futures.ThreadPoolExecutorとどのように適合していますか? – paus

+0

あなたはsqliteを使用していたと言いました。最後にテーブルにメールを送信した時刻を記録することができます。 – Anis

関連する問題