【发布时间】:2015-07-03 07:30:06
【问题描述】:
我有这个程序使用请求库发送 GET 请求,然后将 POST 请求发送到另一台服务器。
import requests
# inside the loop :
headers = {'charset':'utf-8','Content-Type':'application/json'}
url = "http://someurl/_get_v2.php"
data = jenal
try :
resp = requests.post(url,json=data,headers=headers, timeout=(connect_timeout,read_timeout))
print "Post request sent"
# If a connection error occurs, start from the beginning of the loop
except requests.exceptions.ConnectionError as e:
continue
# If a read_timeout error occurs, start from the beginning of the loop
except requests.exceptions.ReadTimeout as e:
continue
time.sleep(10)
这是主循环的 POST 部分。我使用了 try ,除非程序遇到延迟,我不希望它因任何错误而停止,而是刷新并从循环的开头继续,以此类推。从逻辑上讲,程序应该没问题,但是当突然出现多个延迟时,程序会同时发送多个 POST 请求。
例如:日志应该是这样的: 10 发送。 20 发送。 30 发送。 已发送 45 个(延迟 5 秒)。 55已发送
但是发生的事情是这样的:
已发送 10 个
已发送 20 个
已发送 30 个
延迟..
45 已发送
45 已发送
已发送 45 个(同时发送了几份数据,这损坏了我的数据库)
55已发送
我应该如何防止多余的副本?
这是程序的第一部分。如果帖子部分有任何内容,这部分会重复,我每次都能看到打印:
connect_timeout = 3.05
read_timeout = 2
while True:
loop_time_start = time.time()
# GET
url_source = 'http://something/api_json.asp?cmd=list_metering&auth=YWRtaW46YWRtaW4='
try:
url = requests.get(url_source)
print "GET request sent"
except requests.exceptions.ConnectionError as e: continue
【问题讨论】:
-
如果你给它添加一个
boolean,在POST的时候,把它设置为True..posting = True,当你发现一个错误或者完成POST,把它设置为False..posting = False.那么你可以说if not posting:。 -
@RussellHickey 先生,我要把它放在 POST 请求中吗?!
-
把它放在
try:、if not posting: try: posting = True之外。然后在您的print和excepts 中放入posting = False...