Använda processer och trådar

Parallellprogrammering med Dask i Python

James Fulton

Climate Informatics Researcher

Dasks standardschemaläggare

Trådar

  • Dask arrays
  • Dask DataFrames
  • Fördröjda pipelines skapade med dask.delayed()

Processer

  • Dask bags
Parallellprogrammering med Dask i Python

Välja schemaläggare

# Use default
result = x.compute()

result = dask.compute(x)
# Use threads result = x.compute(scheduler='threads')
result = dask.compute(x, scheduler='threads')
# Use processes result = x.compute(scheduler='processes')
result = dask.compute(x, scheduler='processes')
Parallellprogrammering med Dask i Python

Sammanfattning – trådar vs. processer

Trådar

  • Startar mycket snabbt
  • Ingen dataöverföring behövs
  • Begränsas av GIL, som tillåter att en tråd läser koden i taget

Processer

  • Tar tid att starta upp
  • Långsam dataöverföring
  • Har var sin GIL och behöver därför inte turas om att läsa koden
Parallellprogrammering med Dask i Python

Skapa ett lokalt kluster

from dask.distributed import LocalCluster

cluster = LocalCluster(
    processes=True, 
    n_workers=2,
    threads_per_worker=2
)

print(cluster)
LocalCluster(..., workers=2, threads=4, memory=31.38 GiB)
Parallellprogrammering med Dask i Python

Skapa ett lokalt kluster

from dask.distributed import LocalCluster

cluster = LocalCluster(
    processes=False, 
    n_workers=2,
    threads_per_worker=2
)

print(cluster)
LocalCluster(..., workers=2, threads=4, memory=31.38 GiB)
Parallellprogrammering med Dask i Python

Enkelt lokalt kluster

cluster = LocalCluster(processes=True)

print(cluster)
LocalCluster(..., workers=4 threads=8, memory=31.38 GiB)
cluster = LocalCluster(processes=False)

print(cluster)
LocalCluster(..., workers=1 threads=8, memory=31.38 GiB)
Parallellprogrammering med Dask i Python

Skapa en klient

from dask.distributed import Client, LocalCluster
cluster = LocalCluster(
    processes=True, 
    n_workers=4,
    threads_per_worker=2
)

client = Client(cluster)
print(client)
<Client: 'tcp://127.0.0.1:61391' processes=4 threads=8, memory=31.38 GiB>
Parallellprogrammering med Dask i Python

Skapa en klient enkelt

Skapa kluster och skicka det till klienten

cluster = LocalCluster(
    processes=True, 
    n_workers=4,
    threads_per_worker=2
)

client = Client(cluster)

print(client)
<Client: ... processes=4 threads=8, ...>

Skapa klient som skapar sitt eget kluster

client = Client(
    processes=True, 
    n_workers=4,
    threads_per_worker=2
)



print(client)
<Client: ... processes=4 threads=8, ...>
Parallellprogrammering med Dask i Python

Använda klustret

client = Client(processes=True)

# Default uses the client
result = x.compute()

# Can still change to other schedulers result = x.compute(scheduler='threads')
# Can explicitly use client result = client.compute(x)
Parallellprogrammering med Dask i Python

Andra klustertyper

  • LocalCluster() – ett kluster på din dator.
  • Andra klustertyper fördelar beräkningar över flera datorer
Parallellprogrammering med Dask i Python

Nu kör vi en övning!

Parallellprogrammering med Dask i Python

Preparing Video For Download...