/ Vynútiť, aby Python bežal v jednom vlákne - python, python-multithreading

Sila Python spustiť v jednom vlákne - python, python-multithreading

Používam Python s Rasbian OS (na základeLinux) na doske Raspberry Pi. My Python skript používa GPIO (hardvérové ​​vstupy). Všimol som si, keď sa aktivuje GPIO, jeho spätné volanie preruší aktuálne vlákno.

To ma prinútilo používať zámky, aby som predišiel problémomkeď vlákna pristupujú k spoločným prostriedkom. Je to však trochu komplikované. To ma napadlo, že ak GPIO bol "vo fronte", kým hlavné vlákno šlo spať (napr. Hity a.) time.sleep) by to podstatne zjednodušilo (t. j. spôsob, akým sa javascript zaoberá vecami).

Existuje spôsob, ako to implementovať v Pythone?

odpovede:

1 pre odpoveď č. 1

Používate RPi.GPIO library? Alebo zavoláte svoj Python kód z C, keď sa spustí spätné volanie?

V prípade RPi.GPIO, spúšťa platný Python vlákno a nepotrebujete ďalšiu synchronizáciu, ak organizujete interakcie vlákien správne.

Najbežnejším vzorom je vloženie vašej udalosti do frontu (v prípade Pythonu 3) v tejto knižnici bude robiť svoju prácu, Python 2 má toto). Potom, keď je vaše hlavné vlákno pripravené na spracovanie udalosti, spracujte všetky udalosti vo fronte. Jediný problém je, ako nájsť moment na ich spracovanie. Najjednoduchším riešením je implementácia funkcie, ktorá to robí a občas ju nazýva. Ak používate dlhú dobu sleep možno budete musieť rozdeliť do mnohých menších spaní, aby ste sa uistili, že externé udalosti sú spracovávané dosť často. Môžete dokonca implementovať vlastný obal sleep ktorý rozdeľuje jedno veľké oneskorenie na niekoľko menších a spracováva front medzi nimi. Ďalším riešením je použitie Queue.get s timeout parameter namiesto sleep (vráti sa okamžite po príchode udalosti)do frontu), ak však potrebujete spať presne na dobu, ktorú ste zadali, možno budete musieť urobiť nejaké ďalšie čaro, napríklad meranie času sami a volania get Ak budete chcie »po spracovaní udalostí počka» viac času, znova sa pokúste znova o


1 pre odpoveď č. 2

Na uloženie úloh, ktoré chcete vykonať, použite front z viacvláknového modulu. Hlavná slučka periodicky kontroluje, či záznamy vo fronte nenachádzajú a potom ich po jednom vykonajú.

Vaše monitorovacie vlákna GPIO umiestnia svoje úlohy do frontu (na zber z mnohých vlákien je potrebný len jeden).

Svoje úlohy môžete modelovať ako objekty alebo funkčné objekty, ktoré je možné vypovedať.