Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  4 6534
Hei.
Jeg har en tabell med tokens:

ID, token, used

API-et jeg jobber mot har en begrensing på hvor ofte jeg kan kjøre calls med en token. Derfor har jeg en liste med 4 ulike tokens, slik at jeg kan bytte token hver gang jeg kjører et API-call, og dermed får jeg kjørt flere API-calls enn med bare en token.

La oss si at jeg har en liste med 4 tokens:
1: token1
2: token2
3: token3
4: token4

Dette ligger i tabellen "tokens".
Hvert 30. sekund kjører den et API-call, og velger neste token hver gang. Forrige token var token1, så den skal bruke token2 denne gangen, osv.

Det fungerer fint med en while / for loop!

Problemet mitt er at jeg ønsker å kjøre denne Python-roboten på flere maskiner, for å fordele belastningen / oppgavene litt rundt.

Server nr. 2 må vite hvilken token server nr. 1 brukte sist, slik at den kan velge neste token. Server 1 får da vite hvilken token server 2 har brukt, og bruker dermed neste token igjen. Osv.

Derfor har jeg en liten ide, jeg har lagt til kolonnen "used". Hver gang en token blir brukt, blir used satt til 1. Serveren som leser databasen hopper over den, og velger neste token, samt. oppdaterer "used" slik at det blir riktig videre.

Jeg klarer å gjøre at Python forstår at den ikke skal bruke den som er satt til used=1, men jeg klarer ikke å forstå hva jeg må gjøre for at den ikke skal forsøke å finne token nr. 5, men heller starte øverst på lista igjen.

Token nr. 5 eksisterer jo ikke, det er bare en liste med 4 tokens. Den må altså se at token4 er used=1, og dermed sjekke om det finnes flere tokens enn de 4, hvis ikke, begynn øverst på lista igjen med token1 og så videre.

Forslag?
Trigonoceps occipita
vidarlo's Avatar
Donor
Skriv tidspunkt for forrige bruk til ein tabell, og plukk det tokenet som har stått ubrukt lengst.

For å finne tal token tilgjengeleg kan du jo dra en SELECT COUNT('foo') FROM `bar` ;
Hei igjen!
Tusen takk, jeg fant ut at jeg vil gjøre det slik:

Kode

def showtime():
 timx = datetime.datetime.now()
 timz = timx.strftime("%Y%m%d%H%M%S")
 return(timz)
Resultat: 20210103140422

Kode

def gettokens(type):
  query = "SELECT token FROM `tokens` WHERE `type`='%s' ORDER BY `date` ASC;" % (type)
  cur.execute(query)
  if cur.rowcount == 1 or cur.rowcount > 1:
    output = cur.fetchall()
    for row in output:
       token = row[0]
       time = showtime()
       query = "UPDATE `tokens` SET `date` = '%s' WHERE `tokens`.`token`='%s';" % (time, token)
    cur.execute(query)
    return(token)
  else:
   return("0")
Amatørmessig løsning kanskje?

Bare en ting til!
Før jeg lagde denne tråden så fungerte følgende fint:

Kode

def gettokens(type=None):
 if not None in type:
Dette sjekker altså om det blir kjørt gettokens("web-token"), som er riktig, eller om det blir kjørt bare gettokens(), som da vil bli feil.

Etter at jeg fikset opp i det jeg trengte, har jeg plutselig fått:

Kode

    if not None in type:
TypeError: 'in <string>' requires string as left operand, not NoneType
Forstår ikke helt hva jeg har gjort som skal gjøre dette annerledes fra før jeg startet tråden
Sist endret av RogerThat; 3. januar 2021 kl. 15:14. Grunn: Automatisk sammenslåing med etterfølgende innlegg.
Bea
Big Bad Wolf
Bea's Avatar
Jeg ville endret "used" kolonna til å være en timestamp, som inneholder tidspunktet når denne tokenen ble brukt sist.
Da kan du hente ut siste ved å gjøre

Kode

SELECT
...
ORDER BY used 
LIMIT 1
som vil alltid returnere eldste. Pass på å også oppdater "used" kolonna for hver gang du bruker en token.


Et problem du kan ha ved å kjøre dette på flere maskiner er at du vil ha en race condition mellom maskinene, og riskerer å bruke samme token flere ganger på rad, alt etter hvordan du setter opp ting, hvor lang tid calls tar etc. (Dette kan du også løse ved å bruke Transactions)

Ang. nyeste problemet ditt, jeg er ingen Python ekspert men

Kode

def gettokens(type=None):
Tror det har med at du definerer "type=None" her, og når du da gjør "gettokens()" så blir type == NoneType, og

Kode

if not None in type
er en String operasjon som ikke kan gjøres på NoneType. Så mulig du må også sjekke at type <> NoneType
Sist endret av Bea; 3. januar 2021 kl. 16:07.
Sitat av Bea Vis innlegg
Jeg ville endret "used" kolonna til å være en timestamp, som inneholder tidspunktet når denne tokenen ble brukt sist.
Da kan du hente ut siste ved å gjøre

Kode

SELECT
...
ORDER BY used 
LIMIT 1
som vil alltid returnere eldste. Pass på å også oppdater "used" kolonna for hver gang du bruker en token.


Et problem du kan ha ved å kjøre dette på flere maskiner er at du vil ha en race condition mellom maskinene, og riskerer å bruke samme token flere ganger på rad, alt etter hvordan du setter opp ting, hvor lang tid calls tar etc. (Dette kan du også løse ved å bruke Transactions)

Ang. nyeste problemet ditt, jeg er ingen Python ekspert men

Kode

def gettokens(type=None):
Tror det har med at du definerer "type=None" her, og når du da gjør "gettokens()" så blir type == NoneType, og

Kode

if not None in type
er en String operasjon som ikke kan gjøres på NoneType. Så mulig du må også sjekke at type <> NoneType
Vis hele sitatet...
Tusen takk!

Kode

 if not None or not NoneType in type:
Resten av tipsene dine skal jeg huske videre, tusen takk igjen!