5.4.1 • Published 3 months ago

warp v5.4.1

Weekly downloads
723
License
SEE LICENSE IN EU...
Repository
-
Last release
3 months ago

Warp Logo

Warp

Warp is an API allowing easy parallel execution of javascript code, at the same physical time as the main javascript flow and as other flows.

// runs `f` in parallel
warp.call(f, cb);

Installing

Warp module is an API and is not providing support for execution. You will need to acquire a Warp runtime to use it.

To add Warp API to your project:

$ npm install warp

How to use it

Warp offers two main functions starting a warp task: warp.call and warp.callAsPromise. We say that they perform a warp call. By extension, we also say that code warps a function or that the function is warped.

Here is a very simple illustrative code sample where a CPU intensive function (primeDecomposition) is executed in parallel by a warp call keeping the event loop free for any other processing.

The first example uses a callback-based function, whereas the second uses a Promise-based function.

With callback

const warp = require('warp');

function primeDecomposition(n, done) {
  let f = [];
  for (let i = 2; i <= n; i++)
    while (n % i === 0) {
      f.push(i);
      n /= i;
    }
  done(f);
}

warp.call(primeDecomposition, 9007199254740991,
    (a) => console.log(`Value: ${a}`));

Prints out

Value: 6361,69431,20394401

With promise

const warp = require('warp');

function primeDecomposition(n) {
  let f = [];
  for (let i = 2; i <= n; i++)
    while (n % i === 0) {
      f.push(i);
      n /= i;
    }
  return f;
}

let a = await warp.callAsPromise(primeDecomposition, 9007199254740991);
console.log(`Value: ${a}`);

Prints out

Value: 6361,69431,20394401

How it works

When you warp call a function, the execution context (i.e. everything reachable from the function scope) is captured, then this context and the warped function are sent to a distinct execution flow (parallel flow).

Once the warp task is finished, the parallel context is captured and sent back to the main javascript flow. Then, in an event task of the main flow, the context is updated, and:

  • If the warp call is call, the callback is executed in the main flow, with the arguments given to the callback in the parallel flow.
  • If the warp call is callAsPromise, the Promise returned by callAsPromise is resolved or rejected with the value or the exception obtained at the end of the parallel flow.

Scope

The warped functions can read and modify anything reachable from their scope.

In the following sample, the variable o is defined as a free variable (outside of the function). The warped function can read it, and also modify the object. Modifications made to o in the parallel flow are applied and visible in the main flow.

const warp = require('warp');

let o = {};
function primeDecomposition(n) {
  let f = [];
  for (let i = 2; i <= n; i++)
    while (n % i === 0) {
      f.push(i);
      n /= i;
    }
  o.result = f;
}

await warp.callAsPromise(primeDecomposition, 9007199254740991);
console.log(`Value: ${o.result}`);

Prints out

Value: 6361,69431,20394401

Shared resources and concurrency

Warp offers no new synchronization or semaphore mechanism. If you need to manage concurrent access to a value, you'll have to keep the modifying code in the main flow.

In the following example, we compute several prime decompositions in parallel.

const warp = require('warp');

let primeDecompositions = [];

function primeDecomposition(index, n) {
  let f = [];
  for (let i = 2; i <= n; i++)
    while (n % i === 0) {
      f.push(i);
      n /= i;
    }
  primeDecompositions[index] = f;
}

let promises = []
for(let i = 0; i < 8; i++) {
  promises.push(warp.callAsPromise(primeDecomposition, i, 9007174991 + i));
}

await Promise.all(promises);

console.log(`Prime decompositions: %j`, primeDecompositions);

Prints out

Prime decompositions: [17,131,4044533,2,2,2,2,3,23,31,263183,12071,746183,2,37,53,2296577,3,5,7,13,41,227,709,2,2,2251793749,59,109,1400587,2,3,3,3,19,43,204161]

But you need to be carefull about parallel access to shared variables or properties.

For instance, the following example shows bad usage of a shared value causing indetermism. There, you don't know in which order the additions will be made, but it is guaranteed that each compute sees the initial value of v as 4. This means you don't know what the final value of v will be, you just know it will be either 7 or 8.

const warp = require('warp');

let v = 4;
function compute(num) {
  // compute increment from input
  let inc = num;
  v += inc;
  return;
}

let promises = []
promises.push(warp.callAsPromise(compute, 3));
promises.push(warp.callAsPromise(compute, 4));

await Promise.all(promises);

console.log(`Value: ${v}`);

To obtain the correct behavior in this example, you'll need to apply the changes to the shared variable in the main flow by using the .then of the promise.

const warp = require('warp');

let v = 4;
function compute(num) {
  // compute increment from input
  let inc = num;
  return inc;
}

let promises = []
promises.push(warp.callAsPromise(compute, 3).then((inc) => v += inc));
promises.push(warp.callAsPromise(compute, 4).then((inc) => v += inc));

await Promise.all(promises);

console.log(`Value: ${v}`);

Prints out

Value: 11

This way it'll end up with 11 as the final value.

Definitions

Parallel flow

A parallel flow is a javascript execution flow distinct from the main javascript execution flow. The main flow and some parallel flows are running at the same physical time.

Warp task

A warp task is started by a warp call (a call to warp.call or warp.callAsPromise). The task is executed in a parallel flow. It starts by executing the given function and continues until the end of the task is detected.

The end of the task is detected when:

  • an exception is thrown by the task

or

  • If the task was started by warp.callAsPromise:

    • the function given to callAsPromise has returned
    • And, if its returned value is a Promise, it is fulfilled or rejected.
  • If the task was started by warp.call

    • The callback is called,
    • And the function given to call has returned.

Note that this doesn't mean that return was executed, it means that the execution has returned to its caller. For example in the following code the end is detected during the line a = await 3 when await yields and a is still 2.

let a = 0;
async function compute(done) {
  a = 1;
  done();
  a = 2;
  a = await 3; // End is here at `await` before assignation of `a`
  return;
}

Warning: If the task were to attempt to execute code after the end of execution were detected (e.g. with a setImmediate, setTimeout, ...), then the behavior would be unspecified. This means that if the function given to call is starting any asynchronous processing, calling the callback must be the very last thing done by the task.

Execution context

An execution context is referring to everything accessible from the scope of the considered function at a given point of the execution. This includes

  • parameters of the call,
  • local, free and global variables accessed by the function called or by all functions potentially called directly or indirectly,
  • any reachable objects (objects, arrays, functions, symbols) from the above defined parameters/variables.
5.1.0-dev.11031

3 months ago

5.1.0-dev.11018

3 months ago

5.1.0-dev.10737

6 months ago

5.1.0-dev.10857

5 months ago

5.1.0-dev.10881

5 months ago

5.1.2

11 months ago

5.2.3

10 months ago

5.2.2

10 months ago

5.2.1

11 months ago

5.2.0

11 months ago

5.1.0-dev.10097

11 months ago

5.1.0-dev.10096

11 months ago

5.1.0-dev.10628

7 months ago

5.1.0-dev.10626

7 months ago

5.1.0-dev.10620

8 months ago

5.1.0-dev.10605

8 months ago

5.1.0-dev.10474

9 months ago

5.1.0-dev.10342

10 months ago

5.1.0-dev.10580

8 months ago

5.1.0-dev.10460

9 months ago

5.1.0-dev.10346

10 months ago

5.1.0-dev.10218

10 months ago

5.1.0-dev.10698

7 months ago

5.1.0-dev.10456

9 months ago

5.1.0-dev.10442

9 months ago

5.1.0-dev.10200

11 months ago

5.1.0-dev.10207

11 months ago

5.1.0-dev.10204

11 months ago

5.1.0-dev.10678

7 months ago

5.1.0-dev.10437

9 months ago

5.1.0-dev.10530

8 months ago

5.3.3

8 months ago

5.3.2

8 months ago

5.3.1

8 months ago

5.3.0

10 months ago

5.1.0-dev.10077

11 months ago

5.4.1

7 months ago

5.4.0

8 months ago

5.1.0-dev.10293

10 months ago

5.1.0-dev.10285

10 months ago

5.1.0-dev.10168

11 months ago

5.1.0-dev.10150

11 months ago

5.1.0-dev.10148

11 months ago

5.1.0-dev.10493

8 months ago

5.1.0-dev.10250

10 months ago

5.1.0-dev.10248

10 months ago

5.0.0-dev.9613

1 year ago

5.0.0-dev.9625

1 year ago

5.0.0-dev.9862

1 year ago

5.1.1

11 months ago

5.1.0

1 year ago

5.1.0-dev.9984

11 months ago

5.1.0-dev.9878

1 year ago

5.0.0-dev.9816

1 year ago

5.1.0-dev.9974

12 months ago

5.1.0-dev.9971

12 months ago

5.0.0-dev.9828

1 year ago

5.0.0-dev.9436

1 year ago

5.1.0-dev.9948

12 months ago

5.1.0-dev.9945

12 months ago

5.1.0-dev.9953

12 months ago

5.1.0-dev.9954

12 months ago

5.1.0-dev.9951

12 months ago

5.1.0-dev.9958

12 months ago

5.1.0-dev.9955

12 months ago

5.1.0-dev.9950

12 months ago

5.0.0-dev.9572

1 year ago

5.1.0-dev.9926

12 months ago

5.1.0-dev.9922

12 months ago

5.1.0-dev.9937

12 months ago

5.1.0-dev.10040

11 months ago

5.0.0-dev.9636

1 year ago

5.0.0-dev.9510

1 year ago

5.1.0-dev.10037

11 months ago

5.0.0-dev.9519

1 year ago

5.1.0-dev.9918

12 months ago

5.1.0-dev.9910

12 months ago

5.1.0-dev.10025

11 months ago

5.0.0-dev.9774

1 year ago

5.0.0-dev.9168

1 year ago

5.0.3

1 year ago

5.0.2

1 year ago

5.0.1

2 years ago

5.0.0

2 years ago

5.0.0-dev.9294

1 year ago

5.0.0-dev.9296

1 year ago

5.0.0-dev.9182

1 year ago

4.0.0-dev.8925

2 years ago

4.0.0-dev.8924

2 years ago

5.0.0-dev.9062

1 year ago

4.0.0-dev.8918

2 years ago

5.0.0-dev.9236

1 year ago

5.0.0-dev.9359

1 year ago

5.0.0-dev.9243

1 year ago

5.0.0-dev.9362

1 year ago

5.0.0-dev.9136

1 year ago

5.0.0-dev.9012

2 years ago

5.0.0-dev.9135

1 year ago

5.0.0-dev.9149

1 year ago

5.0.0-dev.9141

1 year ago

5.0.0-dev.9202

1 year ago

5.0.0-dev.9223

1 year ago

5.0.0-dev.8938

2 years ago

5.0.0-dev.9306

1 year ago

5.0.0-dev.9304

1 year ago

5.0.0-dev.9309

1 year ago

4.0.0-dev.8822

2 years ago

4.0.0-dev.8828

2 years ago

4.0.0-dev.8802

2 years ago

4.0.0-dev.8730

2 years ago

4.0.0-dev.8852

2 years ago

4.0.0-dev.8712

2 years ago

4.0.0-dev.8651

2 years ago

4.0.0-dev.8890

2 years ago

4.0.0-dev.8882

2 years ago

4.0.0-dev.8886

2 years ago

4.0.0-dev.8686

2 years ago

4.0.0-dev.8795

2 years ago

4.0.0-dev.8670

2 years ago

4.0.0-dev.8371

2 years ago

4.0.0-dev.8366

2 years ago

4.0.0-dev.8369

2 years ago

4.0.0-dev.8470

2 years ago

4.0.21

2 years ago

4.0.23

2 years ago

4.0.22

2 years ago

4.0.0-dev.8399

2 years ago

4.0.0-dev.8400

2 years ago

4.0.0-dev.8469

2 years ago

4.0.0-dev.8459

2 years ago

4.0.0-dev.8458

2 years ago

4.0.0-dev.8237

2 years ago

4.0.20

2 years ago

4.0.0-dev.8285

2 years ago

4.0.0-dev.7892

2 years ago

4.0.19

2 years ago

4.0.16

2 years ago

4.0.18

2 years ago

4.0.17

2 years ago

4.0.0-dev.7889

2 years ago

4.0.0-dev.7873

2 years ago

4.0.0-dev.7869

2 years ago

4.0.0-dev.7855

2 years ago

4.0.0-dev.7681

3 years ago

4.0.0-dev.7657

3 years ago

4.0.15

3 years ago

4.0.0-dev.7625

3 years ago

4.0.0-dev.7588

3 years ago

4.0.0-dev.7569

3 years ago

4.0.0-dev.7567

3 years ago

4.0.0-dev.7542

3 years ago

4.0.0-dev.7540

3 years ago

4.0.0-dev.7429

3 years ago

4.0.0-dev.7521

3 years ago

4.0.0-dev.7520

3 years ago

4.0.0-dev.7525

3 years ago

4.0.0-dev.7524

3 years ago

4.0.0-dev.7522

3 years ago

4.0.0-dev.7517

3 years ago

4.0.0-dev.7519

3 years ago

4.0.0-dev.7514

3 years ago

4.0.0-dev.7516

3 years ago

4.0.0-dev.7500

3 years ago

4.0.14

3 years ago

4.0.0-dev.7431

3 years ago

4.0.13-dev.7427

3 years ago

4.0.0-dev.7398

3 years ago

4.0.0-dev.7397

3 years ago

4.0.0-dev.7396

3 years ago

4.0.0-dev.7402

3 years ago

4.0.13

3 years ago

4.0.0-dev.7392

3 years ago

4.0.0-dev.7390

3 years ago

4.0.0-dev.7389

3 years ago

4.0.0-dev.7370

3 years ago

4.0.0-dev.7365

3 years ago

4.0.12

3 years ago

4.0.0-dev.7356

3 years ago

4.0.0-dev.7354

3 years ago

4.0.0-dev.7297

3 years ago

4.0.0-dev.7328

3 years ago

4.0.0-dev.7310

3 years ago

4.0.0-dev.7300

3 years ago

4.0.0-dev.7308

3 years ago

4.0.0-dev.7306

3 years ago

4.0.0-dev.7290

3 years ago

4.0.0-dev.7287

3 years ago

4.0.0-dev.7278

3 years ago

4.0.0-dev.7275

3 years ago

4.0.0-dev.7266

3 years ago

4.0.0-dev.7241

3 years ago

4.0.0-dev.7215

3 years ago

4.0.0-dev.7202

3 years ago

4.0.0-dev.7203

3 years ago

4.0.0-dev.7207

3 years ago

4.0.0-dev.7169

3 years ago

4.0.0-dev.7167

3 years ago

4.0.0-dev.7161

3 years ago

4.0.0-dev.7163

3 years ago

4.0.0-dev.7158

3 years ago

4.0.0-dev.7157

3 years ago

4.0.0-dev.7156

3 years ago

4.0.0-dev.7154

3 years ago

4.0.0-dev.7153

3 years ago

4.0.0-dev.7147

3 years ago

4.0.0-dev.7146

3 years ago

4.0.0-dev.7149

3 years ago

4.0.11

3 years ago

4.0.0-dev.7139

3 years ago

4.0.0-dev.7132

3 years ago

4.0.0-dev.7131

3 years ago

4.0.0-dev.7130

3 years ago

4.0.0-dev.7126

3 years ago

4.0.0-dev.7113

3 years ago

4.0.0-dev.7108

3 years ago

4.0.0-dev.7081

3 years ago

4.0.0-dev.7080

3 years ago

4.0.0-dev.7065

3 years ago

4.0.0-dev.7040

3 years ago

4.0.0-dev.7043

3 years ago

4.0.10

3 years ago

4.0.0-dev.7004

3 years ago

4.0.9

3 years ago

4.0.0-dev.6920

3 years ago

4.0.0-dev.6914

3 years ago

4.0.0-dev.6903

3 years ago

4.0.0-dev.6930

3 years ago

4.0.0-dev.6935

3 years ago

4.0.0-dev.6937

3 years ago

4.0.0-dev.6880

3 years ago

4.0.0-dev.6885

3 years ago

4.0.0-dev.6878

3 years ago

4.0.0-dev.6895

3 years ago

4.0.0-dev.6859

3 years ago

4.0.0-dev.6843

3 years ago

4.0.0-dev.6840

3 years ago

4.0.0-dev.6832

3 years ago

4.0.0-dev.6831

3 years ago

4.0.0-dev.6836

3 years ago

4.0.0-dev.6829

3 years ago

4.0.0-dev.6827

3 years ago

4.0.0-dev.6770

3 years ago

4.0.0-dev.6762

3 years ago

4.0.0-dev.6768

3 years ago

4.0.0-dev.6767

3 years ago

4.0.0-dev.6634

3 years ago

4.0.0-dev.6592

3 years ago

4.0.0-dev.6635

3 years ago

4.0.0-dev.6582

3 years ago

4.0.8

3 years ago

4.0.0-dev.6745

3 years ago

4.0.0-dev.6615

3 years ago

4.0.0-dev.6722

3 years ago

4.0.0-dev.6569

3 years ago

4.0.0-dev.6700

3 years ago

4.0.0-dev.6702

3 years ago

4.0.0-dev.6658

3 years ago

4.0.0-dev.6526

3 years ago

4.0.0-dev.6521

3 years ago

4.0.0-dev.6515

3 years ago

4.0.0-dev.6514

3 years ago

4.0.0-dev.6506

3 years ago

4.0.0-dev.6503

3 years ago

4.0.0-dev.6508

3 years ago

4.0.0-dev.6498

3 years ago

4.0.0-dev.6496

3 years ago

4.0.0-dev.6494

3 years ago

4.0.0-dev.6488

3 years ago

4.0.7

3 years ago

4.0.0-dev.6293

3 years ago

4.0.6

3 years ago

4.0.0-dev.6201

3 years ago

4.0.0-dev.6179

3 years ago

4.0.0-dev.6160

3 years ago

4.0.0-dev.6099

3 years ago

4.0.5

3 years ago

4.0.0-dev.5995

3 years ago

4.0.0-dev.6011

3 years ago

4.0.0-dev.5794

3 years ago

4.0.4

3 years ago

4.0.0-dev.5781

3 years ago

4.0.0-dev.5768

3 years ago

4.0.0-dev.5754

3 years ago

4.0.0-dev.5759

3 years ago

4.0.0-dev.5756

3 years ago

4.0.0-dev.5652

3 years ago

4.0.3

3 years ago

4.0.2

3 years ago

4.0.0-dev.5613

3 years ago

4.0.0-dev.5600

3 years ago

4.0.0-dev.5553

3 years ago

4.0.0-dev.5554

3 years ago

4.0.0-dev.5556

3 years ago

4.0.0-dev.5557

3 years ago

4.0.1

3 years ago

4.0.0-dev.5569

3 years ago

4.0.0-dev.5549

3 years ago

4.0.0-dev.5496

3 years ago

4.0.0-dev.5504

3 years ago

4.0.0

3 years ago

4.0.0-dev.5476

3 years ago

4.0.0-dev.5475

3 years ago

4.0.0-dev.5470

3 years ago

4.0.0-dev.5471

3 years ago

4.0.0-dev.5466

3 years ago

4.0.0-dev.5469

3 years ago

4.0.0-dev.5451

3 years ago

4.0.0-dev.5449

3 years ago

4.0.0-dev.5446

3 years ago

4.0.0-dev.5442

3 years ago

4.0.0-dev.5428

3 years ago

4.0.0-dev.5401

3 years ago

4.0.0-dev.5334

3 years ago

4.0.0-dev.5237

3 years ago

4.0.0-dev.5232

3 years ago

4.0.0-dev.5246

3 years ago

4.0.0-dev.5225

3 years ago

4.0.0-dev.5189

3 years ago

4.0.0-dev.5181

3 years ago

4.0.0-dev.5178

3 years ago

4.0.0-dev.5151

3 years ago

4.0.0-dev.5145

3 years ago

4.0.0-dev.5140

3 years ago

4.0.0-dev.5121

3 years ago

3.0.0-dev.5109

4 years ago

3.0.0-dev.5083

4 years ago

3.0.0-dev.4978

4 years ago

3.0.0-dev.4975

4 years ago

3.0.0-dev.4914

4 years ago

3.0.0-dev.4567

4 years ago

3.0.0-dev.4612

4 years ago

3.0.11

4 years ago

3.0.0-dev.4524

4 years ago

3.0.0-dev.3779

4 years ago

3.0.0-dev.3622

4 years ago

3.0.10

4 years ago

3.0.8

4 years ago

3.0.9

4 years ago

3.0.7

4 years ago

3.0.6

4 years ago

3.0.0-dev.3197

4 years ago

3.0.0-dev.3050

4 years ago

3.0.0-dev.3071

4 years ago

3.0.4

4 years ago

3.0.5

4 years ago

3.0.0-dev.3022

4 years ago

3.0.0-dev.3012

4 years ago

3.0.0-dev.3015

4 years ago

3.0.0-dev.2957

4 years ago

3.0.0-dev.2926

4 years ago

3.0.0-dev.2922

4 years ago

3.0.3

4 years ago

3.0.0-dev.2892

4 years ago

3.0.2

4 years ago

3.0.1

4 years ago

3.0.0-dev.2890

4 years ago

3.0.0-dev.2866

4 years ago

3.0.0-dev.2855

4 years ago

3.0.0-dev.2823

4 years ago

3.0.0

4 years ago

3.0.0-dev.2803

4 years ago

3.0.0-dev.2815

4 years ago

3.0.0-dev.2799

4 years ago

3.0.0-dev.2776

4 years ago

3.0.0-dev.2761

4 years ago

3.0.0-dev.2763

4 years ago

3.0.0-dev.2750

4 years ago

3.0.0-dev.2755

4 years ago

3.0.0-dev.2743

4 years ago

3.0.0-dev.2744

4 years ago

3.0.0-dev.2680

4 years ago

1.1.4

4 years ago

1.1.0-dev.61

4 years ago

1.2.0-dev.163

5 years ago

1.2.0-dev.161

5 years ago

1.2.0-dev.149

5 years ago

1.1.0-dev.144

5 years ago

1.1.3

5 years ago

1.1.2

5 years ago

1.1.0-dev.112

5 years ago

1.1.1

5 years ago

1.1.0

5 years ago

1.1.0-dev.101

5 years ago

1.1.0-dev.75

5 years ago

1.1.0-dev.72

5 years ago

1.1.0-dev.69

5 years ago

1.1.0-eng.0

5 years ago

1.1.0-dev.67

5 years ago

1.0.1

5 years ago

1.0.0

5 years ago

1.0.0-dev.4

5 years ago

1.0.0-dev.15

5 years ago

1.0.0-eng.2

5 years ago

1.0.0-eng.1

5 years ago

1.0.0-eng.0

5 years ago

0.1.5

13 years ago

0.1.4

13 years ago

0.1.3

13 years ago

0.1.2

13 years ago

0.1.1

13 years ago

0.1.0

13 years ago

0.0.3

13 years ago

0.0.2

13 years ago

0.0.1

13 years ago