From 2388edcf6d43308ad0cc2e93d313498d78a7cafe Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Mon, 23 Dec 2019 21:25:00 +0100 Subject: [PATCH] async calctrimp task using microservice --- rowers/rowing_workout_metrics_pb2_grpc.py | 2 +- rowers/tasks.py | 128 ++++++---------------- 2 files changed, 34 insertions(+), 96 deletions(-) diff --git a/rowers/rowing_workout_metrics_pb2_grpc.py b/rowers/rowing_workout_metrics_pb2_grpc.py index 099bf538..b58e9986 100644 --- a/rowers/rowing_workout_metrics_pb2_grpc.py +++ b/rowers/rowing_workout_metrics_pb2_grpc.py @@ -1,7 +1,7 @@ # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! import grpc -import rowing_workout_metrics_pb2 as rowing__workout__metrics__pb2 +import rowers.rowing_workout_metrics_pb2 as rowing__workout__metrics__pb2 class MetricsStub(object): diff --git a/rowers/tasks.py b/rowers/tasks.py index 8c455a4e..727c3b41 100644 --- a/rowers/tasks.py +++ b/rowers/tasks.py @@ -38,6 +38,8 @@ from matplotlib import path import grpc import rowers.otw_power_calculator_pb2 as calculator_pb2 import rowers.otw_power_calculator_pb2_grpc as calculator_pb2_grpc +import rowers.rowing_workout_metrics_pb2 as metrics_pb2 +import rowers.rowing_workout_metrics_pb2_grpc as metrics_pb2_grpc from rowsandall_app.settings import SITE_URL from rowsandall_app.settings_dev import SITE_URL as SITE_URL_DEV @@ -609,105 +611,41 @@ def handle_calctrimp(id, else: engine = create_engine(database_url, echo=False) - try: - rowdata = rdata(csvfile=csvfilename) - except IOError: + tss = 0 + normp = 0 + trimp = 0 + hrtss = 0 + normv = 0 + normw = 0 + + with grpc.insecure_channel( + target='localhost:50052', + options=[('grpc.lb_policy_name', 'pick_first'), + ('grpc.enable_retries', 0), ('grpc.keepalive_timeout_ms', + 10000)] + ) as channel: try: - rowdata = rdata(csvfile=csvfilename + '.csv') - except IOError: - try: - rowdata = rdata(csvfile=csvfilename + '.gz') - except IOError: - return 0 + grpc.channel_ready_future(channel).result(timeout=10) + except grpc.FutureTimeoutError: + return 0 - df = rowdata.df - - try: - df['deltat'] = df[' ElapsedTime (sec)'].diff().abs() - except KeyError: - return 0 - - df2 = df.copy() - - df2['time'] = df2[' ElapsedTime (sec)'] - df2['time'] = df2['time'].apply( - lambda x:safetimedelta(x) + stub = metrics_pb2_grpc.MetricsStub(channel) + req = metrics_pb2.WorkoutMetricsRequest( + filename = csvfilename, + ftp=ftp, + sex=sex, + hrftp=hrftp, + hrmax=hrmax, + hrmin=hrmin, ) + response = stub.CalcMetrics(req,timeout=60) - duration = df['TimeStamp (sec)'].max()-df['TimeStamp (sec)'].min() - df2 = df2.resample('1s',on='time').mean() - df2.fillna(method='ffill',inplace=True) - df2 = df2.rolling(30).mean() + tss = response.tss + normp = response.normp + trimp = response.trimp + normv = response.normv + normw = response.normw - df2[' Power (watts)'] = df2[' Power (watts)'].abs() - - df2['pwr4'] = df2[' Power (watts)']**(4.0) - # pwr4mean = wavg(df,'pwr4','deltat') - pwr4mean = df2['pwr4'].mean() - pwrmean = df2[' Power (watts)'].mean() - # pwrmean = wavg(df,' Power (watts)','deltat') - if pwr4mean > 0: - normp = (pwr4mean)**(0.25) - else: - normp = pwrmean - - intensityfactor = normp/float(ftp) - tss = 100.*((duration*normp*intensityfactor)/(3600.*ftp)) - - - if sex == 'male': - f = 1.92 - else: - f = 1.67 - - dt = df['TimeStamp (sec)'].diff()/60. - - hrr = (df[' HRCur (bpm)']-hrmin)/(hrmax-hrmin) - hrrftp = (hrftp-hrmin)/float(hrmax-hrmin) - trimp1hr = 60.*hrrftp*0.64*np.exp(f*hrrftp) - - trimpdata = dt*hrr*0.64*np.exp(f*hrr) - trimp = trimpdata.sum() - - hrtss = 100.*trimp/trimp1hr - - pp = 8.0 - - df['v4'] = df[' AverageBoatSpeed (m/s)']**(pp) - v4mean = wavg(df,'v4','deltat') - normv = v4mean**(1./pp) - - try: - df['w4'] = df['driveenergy']**(pp) - w4mean = wavg(df,'w4','deltat') - normw = w4mean**(1./pp) - except KeyError: - normw = 0 - - - if not np.isfinite(normv): - normv = 500./120. - - if not np.isfinite(normw): - normw = 0 - - try: - dum = int(tss) - except ValueError: - tss = 0 - - try: - dum = int(normp) - except ValueError: - normp = 0 - try: - dump = int(trimp) - except ValueError: - trimp = 0 - try: - dump = int(hrtss) - except ValueError: - hrtss = 0 query = 'UPDATE rowers_workout SET rscore = {tss}, normp = {normp}, trimp={trimp}, hrtss={hrtss}, normv={normv}, normw={normw} WHERE id={id}'.format( tss = int(tss), @@ -1603,7 +1541,7 @@ def handle_otwsetpower(self,f1, boattype, weightvalue, try: rowdata = rdata(csvfile) except IOError: - rowdata = rdata(csvfile) + rowdata = rdata(csvfile) else: boatfile = {