[LØST] Hvordan lage "ikkelinære" programmer?

9 innlegg i emnet

Skrevet

Dersom jeg bruker feil utrykk her så e det følgende jeg skal frem til:

Synes det begynner å bli kjedelig å lage programmer på denne måten: gjør a, gjør b, gjør c osv. Finnes det en mulighet for å kjøre flere ting samtidig?

For eksempel: Et hovedprogram kjører i bakgrunnen, dette venter på input fra flere funksjoner (noe som kan ta tid) Funksjon a henter data og funksjon b bearbeider data. Begge funksjonene er krevende og tar tid. Hovedprogrammet overfører data fra a til b, men når b kjører hadde det vært fordelaktig å sette a på neste oppgave, slik at når b er ferdig med første datasett er neste allerde klar.

Forstår dere? Har sikkert brukt masse utrykk som ikke henger på greip :P

0

Del dette innlegget


Lenke til innlegg
Del på andre sider

Skrevet

JA, kjøring av flere oppgaver "samtidig" er mulig.

Et typisk eksempel er å kjøre en utskriftsjobb i bakgrunnen mens du fortsetter å arbeide i Word. Her kan du f.eks. åpne et nytt dokument og forberede dette for utskrift mens den andre utskriften holder på i bakgrunnen. Ressursene blir fordelt mellom oppgavene, så de deler egentlig på bruk av prosessoren "litt fra den ene, litt fra den andre".

Å oversette dette til din a+b oppgave er litt mer vrient.

- den ene oppgaven gir inntrykk av å kreve input fra brukeren ?

- den andre oppgaven gir inntrykk av å arbeide i bakgrunnen uansett, men får oppgavene fra den første ?

Kan du gi litt mer konkret beskrivelse av hva dette gjelder ?

0

Del dette innlegget


Lenke til innlegg
Del på andre sider

Skrevet

For eksempel: Et hovedprogram kjører i bakgrunnen, dette venter på input fra flere funksjoner (noe som kan ta tid) Funksjon a henter data og funksjon b bearbeider data. Begge funksjonene er krevende og tar tid. Hovedprogrammet overfører data fra a til b, men når b kjører hadde det vært fordelaktig å sette a på neste oppgave, slik at når b er ferdig med første datasett er neste allerde klar.

Høres ut som en typisk workpool-arkitektur.

Du har ulike komponenter for å hente inn data A1-An. Når en A-komponent har hentet inn nok data så genererer den en workitem som den legger i en workpool (kan være alt fra en enkel kø til en mer kompleks struktur). Komponent B kjører i en egen tråd og "spør" kontinuerlig en workpool om oppgaver. Straks den får en oppgave fra workpool'en så konsumerer den oppgaven og begynner å jobbe med den. Du kan også ha flere instanser kjørende av komponent B, så hvis en instans allerede jobber med en oppgave, og det dukker opp en ny workitem i pool'en, så kan en annen B-instans konsumere oppgaven.

Raskt skissert opp:

PROCESS A														PROCESS B


  A1 --creates--->  WORKITEM ---\

  A2 --creates--->  WORKITEM ------>  WORKPOOL  ------> WORKITEM --> B1

  A3 --creates--->  WORKITEM ---/				  \----> NOOP ----> B2

Her er 2 uavhengige prosesser, A og B. Litt avhengig av størrelsesordenen på systemet kan det være 2 tråder i samme applikasjon, eller 2 separate applikasjoner. Hver prosess har n tråder. I prosess A har hver tråd ansvar for å hente inn input og lage WORKITEMS fra input'en. Det kan gjerne være kun 1 tråd, altså hovedtråden som prosess A kjører i. I skissen over har prosess A tre tråder: A1, A2 og A3. Tilsvarende for prosess B, den har et antall tråder for hvor mange WORKITEM-konsumenter som trengs. Kanskje trengs det flere tråder for å jobbe med flere oppgaver samtidig? Kanskje er det hensiktsmessig med flere WORKITEM-konsumenter for ulike typer WORKITEMs. I eksemplet over har B1 spurt om en oppgave og fått en WORKITEM. B2 har også spurt om en oppgave, men workpoolen var tom så den får beskjed om dette (NOOP, no operation, eller tilsvarende). WORKPOOL'en er en statisk ressurs som deles av begge prosessene. Kan f.eks. være en køstruktur i en mindre applikasjon, eller en databasetabell i et større system.

0

Del dette innlegget


Lenke til innlegg
Del på andre sider

Skrevet

Både Morten å Rune var inne på det nå, selv om Rune traff spot on.

Det jeg ønsker å oppnå er rett og slett "threading" av programmet? Er dette noe kluss å få til? Jeg tenker spesielt på litt større programmer som jeg planlegger hvor muligens flere funksjoner sammarbeider, og det hadde vært gunstig å kjøre dem samtidig. Er løsningen at hver av infuksjonene generer et output (feks en tmp eller txt fil), som deretter blir "spist" av utfunksjonene, for deretter skriver til hovedprogrammet som presenterer bearbeide data?

0

Del dette innlegget


Lenke til innlegg
Del på andre sider

Skrevet

Sikkert litt avhengig av hvilket språk du bruker, da noen har bedre trådstøtte enn andre. I f.eks. Java kan du enkelt starte en ny tråd ved å implementere interfacet Runnable, og bruke Thread-klassen til å opprette en tråd fra din Runnable-implementasjon og starte den. Kompleksiteten ved trådhåndtering kommer gjerne i det øyeblikket du må la flere tråder "snakke sammen", og nettopp dette er jo litt av hensikten med tråder: å utføre handlinger som ikke er avhengig av hverandre samtidig, men også synkronisere slik at de handligene som ikke kan gjøres før noe annet er gjort faktisk ikke utføres for tidlig. Oppå dette igjen kommer også deling av ressurser mellom trådene.

I de senere versjonene av Java har det kommet en concurrent-pakke som tilbyr mer hjelp til trådhåndtering:

http://java.sun.com/javase/6/docs/api/java...age_description

Er det større systemer du skal lage så kan du sette deg inn i Enterprise Integration Patterns og Message-Oriented Middleware. Det finnes mange implementasjoner av dette, både kommersiell og fri programvare. Et eksempel er http://camel.apache.org. Enklere pool-baserte måter å håndtere igangsetting av prosesser kan du sikkert implementere på egen hånd. Det er god øvelse i trådhåndtering.

Litt på siden: Mange mener at programmeringsspråk nå er nødt til å bedre tilpasses samtidighet, ettersom prosessorteknologi har så og si nådd den mulige grensen for hvor raskt de kan utføre operasjoner i sekvens; de kan ikke fysisk bli stort mindre. Erlang er et av de mer kjente eksemplene.

0

Del dette innlegget


Lenke til innlegg
Del på andre sider

Skrevet

Takker for svar. Bra at noen fremdeles innehar kunnskap på dette forumet :)

En annen ting, dersom du skal anbefale et programmerinsspråk til denne type oppgaver, hva vil det isåfall være? Alt kunnskap jeg sitter inne med er selvlært, men somregel klarer jeg å få til det jeg ønsker ;) Fra før har jeg brukt c++ og bittelitt python. Python er jo ok, men irriterende å måtte installere det på hver maskin du skal bruke programmet på. C++ er plagsomt (ihvertfall for uproffe som meg) med at du må passe på hvilke typer som forsvinner inn og ut av funksjoner for at det i hele tatt skal gjøre det du vil..

Skal bruke QT for å lage GUI til programmet dersom det betyr noe.

0

Del dette innlegget


Lenke til innlegg
Del på andre sider

Skrevet

Tja... Du kan jo bruke Java med QT Jambi: http://www.qtsoftware.com/products/appdev/...anguage-support. Java må også forsåvidt installeres for å kunne kjøre programmene, men dette er som regel installert fra før, i alle fall mye oftere enn en Python interpreter.

Det finnes vel 3. parts rammeverk for å tilby støtte for tråder i C++, men dette har jeg ingen erfaring med selv. Men hvis du ikke liker statisk typede språk så er kanskje hverken Java eller C++ noe å satse på...

Dynamiske språk som Python og Ruby har jo fått en del hype i det siste. Du kan kanskje se på muligheter for å kjøre disse språkene på Java-platformen eller .NET? JRuby fungerer veldig bra vet jeg, og det finnes også Jython for Java og IronPython for .NET

0

Del dette innlegget


Lenke til innlegg
Del på andre sider

Skrevet

Oktakk, skal se nærmere på Ruby :)

0

Del dette innlegget


Lenke til innlegg
Del på andre sider

Skrevet

Guido van Rossum

"Unfortunately, for most mortals, thread programming is just Too Hard to get right.... Even in Python -- every time someone gets into serious thread programming, they send me tons of bug reports, and half of them are subtle bugs in the Python interpreter, half of them are subtle problems in their own understanding of the consequences of multiple threads...."

Som du ser har dette vært et vanskelig felt,ting har blitt lettere med nyere utgivelser av python.

Python 2.6 og 3.0 ny multiprocessing module noe som gjør dette lettere.

http://docs.python.org/library/multiproces...multiprocessing

http://blog.programmerslog.com/?p=207

http://roopindersingh.com/2008/10/07/pytho...multithreading/

Litt forklaring.

http://jessenoller.com/code/pyworks.pdf

Selv om ting har blitt lettere med threading/ multiprocessing er som regel dette ikke noe man stater med.

Klart du prøve og se hvordan det går.

0

Del dette innlegget


Lenke til innlegg
Del på andre sider

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!


Start en konto

Logg inn

Har du allerede en konto? Logg inn her.


Logg inn nå

  • Hvem er aktive   0 medlemmer

    Ingen innloggede medlemmer aktive