micropython / micropython/micropython-lib

requests do not works in mutithread, breaks the whole script/device

Abierto
#772 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Lenguaje dominante
Python
Estrellas
2.9k
Forks
1.1k
Merge medio
7 d 6 h
PR fusionados (30 d)
3

Descripción

A simple script like this, breaks the whole script or device when trying to make requests from two works ¿? I dont know exactly how to call the problem but you can replicate it easily.

Im using MicroPython v1.21.0 on 2023-10-06; Raspberry Pi Pico W with RP2040

The main loop can work fine forever (pinging the url) but as soon as i press the button it breaks with this random behaviors:

  1. Main loop requests hangs and remains until timeout, i can raise timeout to hours and request still hanged forever, 2nd thread request go out fine for one time but if i press button again it just hangs too and it just hangs forever until reboot device
  2. Main loop request hangs forever and button requests works fine every-time i press button
  3. Button requests pass fine for one time, then it hangs but Main loop request works fine forever

I have been trying to make it works for 1 week and it just don work, what i tried:

Using thread.allocate_lock()
Making two request functions (one for main loop one for button press request)
make a clone of request library and import it with a different name, then calling the requests library from main loop and the cloned library from button request
using other gpio button (not the bootsel button)
use the 2nd thread function without button (making it automatically with a sleep times)

All tries ended on the same problem, also i have use a longer sleep times for the main loop and press the button to call the request function some minutes after the main loop ended and it do the same

It seems (at my poor knowledge on python) that requests library do not "release" (or close) at all the requests and it leave only available for the first core that use it?

How can i make it works with this two threads functions?

import utime, _thread, ujson, requests, network

ssid_name = 'xxx'
ssid_pass = 'xxx'
wlan = network.WLAN(network.STA_IF)
wlan.active(True)

def make_http_request(url):
    print("request entry")
    r = None
    response_data = None
    try:
        print("trying block")
        r = requests.get(url, timeout=10)
        response_data = ujson.loads(r.text)
        r.close()
        return response_data
    except Exception as e:
        print("Error:", e)
        raise
    finally:
        if r is not None:
            r.close()
                
def bootsel():
    import rp2
    while True:
        if rp2.bootsel_button() == 1:
            print("pressed")
            but_data = make_http_request("https://httpbin.org/get")
            print(f"But: {but_data}")

_thread.start_new_thread(bootsel,())
while True:
    if wlan.isconnected():
        print("connected.. pinging")
        ping = make_http_request("https://httpbin.org/get")
        print(f"Ping: {ping}")
        print("sleeping")
        utime.sleep(45)
    else:
        time=0
        while not wlan.isconnected():
            print ('connecting...')
            wlan.connect(ssid_name, ssid_pass)
            while not wlan.isconnected():
                time = time + 1
                print(f'waiting connection {time}')
                utime.sleep_ms(1000)

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Línea de trabajo

Comienza reproduciendo el script proporcionado en MicroPython v1.21.0 con una Raspberry Pi Pico W, centrándote en make_http_request, bootsel, _thread y requests.get. Compara las solicitudes del bucle principal con las activadas por el botón, incluidos los bloqueos informados, y utiliza solicitudes repetidas satisfactorias desde ambas rutas como criterio de finalización.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
python
Área
embedded-iot, networking
Tipo de issue
Error
Dificultad
4/5
Tiempo estimado
3-5 días
Estado de actividad
Estancado
Claridad
Necesita aclaración
Aptitud para principiantes
25/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.