PHP multi tasking

Viestiketju alueella 'Ohjelmointi' , aloittaja Kasgel, 12.08.2018.

  1. Kasgel

    Rekisteröitynyt:
    07.10.2012
    Viestejä:
    61
    Moro,

    Pystyykö joku suosittelemaan jotain tekniikkaa/kirjastoa, jolla voisi hoitaa multithreading/parallel processing PHP:llä? Pitäisi saada backendissä prosessi käsittelemään jonossa olevia operaatioita yhtäaikaisesti ja olen yrittänyt etsiä parasta mahdollista tapaa toteuttaa tämän.

    Tietokantaan tulee jouhevasti aina parin minuutin välin operaatioita suoritettavaksi ja tähän asti ne on yksinkertaisuuden vuoksi käsitelty cron jobilla. Ongelmaksi muodostuu se, että joidenkin operaatioiden käsittelyssä voi kestää jopa pari minuuttia ja seuraava cron job saattaa jo lähteä suoriutumaan ennen kuin edellinen on valmistunut.
    Voisin laittaa siihen eston, ettei seuraava lähde suoriutumaan jos edellinen on yhä päällä. Ennemmin kuitenkin loisin yhden prosessin, joka olisi jatkuvasti päällä, ja joka aina tietyin väliajoin katsoo DB:stä uudet operaatiot ja käsittelee ne omassa threadissaan.

    Googlaamalla löysin esim. pthreads, Amp\Thread, pcntl_fork (process forking), mutta ajattelin jos teillä olisi ideoita tämän toteutukseen?
     
  2. montun reunalla

    Rekisteröitynyt:
    14.10.2014
    Viestejä:
    133
    PHP:n asetuksista saa session kestämään paljon pidempään.

    Oikeaksi vikakohdaksi kuitenkin väittäisin sinun tietokannan väärin runkkaamista. Lisää avaimia ja yhteyksiä. Hidastaa keskimäärin, mutta nopeuttaa jos on erinäisiä jänniä hakuja.
     
  3. Kasgel

    Rekisteröitynyt:
    07.10.2012
    Viestejä:
    61
    Taisin selittää hieman huonosti. Minulla ei ole mahdollista nopeuttaa varsinaisten operaatioiden suorittamista. Niiden suorittaminen vaatii pyyntöjä kolmannen osapuolen API-rajapintaan ja se on erittäin hidas. Koodini ei siis runkkaa tietokantaa lähes ollenkaan, ensin se vain noutaa sieltä operaation tiedot ja tietojen perusteella tekee pyyntöjä API-rajapintaan. Ja lopuksi toki merkkaa operaation suoritetuksi :)
     
  4. ontelo

    Rekisteröitynyt:
    22.11.2002
    Viestejä:
    4 344
    Itellä oli samanlainen tilanne, mutta kyselyitä saattoi tulla tuhansia minuuteissa.

    Croni rullasi joka minuutti otti n määrän taskeja (ORDER BY lastrun tjsp) ja merkkasi ne lukkoon. Jos taskeja oli vielä jäljellä kun toinen kysely lähti, otti se seuraavat n kappaleet jotka eivät olleet lukossa. Kun tuli valmista niin lukko vapautettiin ja lastrun päivitettiin.

    Croniahan ei voi ajaa minimissään kuin minuutin viiveellä niin loin sitte vielä sh scriptit jotka loopasivat samaa taskia n määrän.

    Sitte säätelin tota taskien/looppien määrää sopivaksi, jotta lähti rullaamaan sulavasti.

    Multithreadaus ei auta kuin prosessori-intensiivissä laskujutuissa, eikä PHP ole erityisen hyvä siinä muutenkaan. Jos sun skriptit odottaa kuitenkin kolmannen osapuolen APIa niin multithreadauksesta ei ole mitään hyötyä.
     
    Viimeksi muokattu: 11.09.2018
  5. MoonCow

    Rekisteröitynyt:
    20.08.1999
    Viestejä:
    706
    Yksinkertaisin tapa olisi varmasti kirjoittaa cronitaskin alussa lukko (tämä voi olla esimerkiks tempfile tai jokin atominen kantaoperaatio) ja vapauttaa se suorituksen lopuksi. Mikäli parallelisointi auttaa niin yhtä lailla voit forkata sitä (ba)shiskriptiä, tai mistä ikinä kantaa kosketteletkin.
     
  6. Grez

    Rekisteröitynyt:
    30.04.2001
    Viestejä:
    5 695
    Mun mielestä lähdet avaamaan ongelmaa ihan väärästä päästä. Jos jossain yksittäisessä hommassa kestää odottelun takia "liian pitkään" niin siinä kestää vähintään yhtä kauan vaikka ajaisit useampia rinnan.

    Mielestäni tuo useampi cronjob yhtä aikaa on itse asiassa hyvin yksinkertainen ratkaisu tuohon kysymykseesi, että miten saat PHP:n suorittamaan useita tehtäviä samanaikaisesti.

    Nyt sinun vaan täytyy tehdä koodiin sellainen muutos että kun yksi PHP-skripti on ottanut jonkun tehtävän käsiteltäväksi (tai saanut sen valmiiksi) niin sitä tehtävää ei enää oteta uuteen skriptiin.

    Eli ajatellaan että tietokokantaan kirjautuisi tehtäviä joilla on yksilöivä numero ja sitten 2 min välein ajetaan cronjobia:

    12:00:10 Tehtävä 382, kesto 20s
    12:00:15 Tehtävä 383, kesto 300s
    12:01:30 Tehtävä 384, kesto 10s
    12:02:00 Ajetaan cronjob, joka ottaa tehtävät 382-384
    12:02:35 Tehtävä 385, kesto 20 s
    12:03:33 Tehtävä 386, kesto 20 s
    12:04:00 Ajetaan cronjob, joka ottaa tehtävät 385-386

    Eli tässä kuviossa tuo ensimmäinen cronjob valmistuisi vasta 12:07:30, mutta se ei haittaa koska rinnalla tuo jälkimmäinen cronjob olisi jo puksutellut nuo tehtävät 385-386.
     

Jaa tämä sivu

Alibi
Anna
Deko
Dome
Erä
Hymy
Kaksplus
Kippari
Kotilääkäri
Kotiliesi
Koululainen
Ruoka.fi
Parnasso
Seura
Suomen Kuvalehti
TM Rakennusmaailma
Tekniikan Maailma
Vauhdin Maailma
Golfpiste
Vene
Nettiauto
Ampparit
Plaza
Muropaketti