Skip to content

each, peach

Iterate a unary

 v1 each x   each[v1;x]       v1 peach x   peach[v1;x]  
(vv)each x   each[vv;x]      (vv)peach x   peach[vv;x]

Where

applies v1 or vv as a unary to each item of x and returns a result of the same length.

That is, the projections each[v1;], each[vv;], peach[v1;], and peach[vv;] are uniform functions.

q)count each ("the";"quick";" brown";"fox")
3 5 5 3
q)(+\)peach(2 3 4;(5 6;7 8);9 10 11 12)
2 5 9
(5 6;12 14)
9 19 30 42

each and peach perform the same computation and return the same result.

peach will divide the work between available secondary tasks.

Changes since 4.1t 2024.01.04

peach workload distribution methodology changed to dynamically redistribute workload and allow nested invocation. The limitations on nesting have been removed, so peach (and multi-threaded primitives) can be used inside peach. To facilitate this, round-robin scheduling has been removed. Even though the initial work is still distributed in the same manner as before for compatibility, the workload is dynamically redistributed if a thread finishes its share before the others.

each is a wrapper for the Each iterator. peach is a wrapper for the Each Parallel iterator. It is good q style to use each and peach for unary values.

each is redundant with atomic functions. (Common qbie mistake.)

Maps for uses of Each with binary and higher-rank values
.Q.fc parallel on cut
Parallel processing
Table counts in a partitioned database
Q for Mortals A.68 peach

Higher-rank values

peach applies only unary values. For a values of rank ≥2, use Apply to project v as a unary value.

For example, suppose m is a 4-column matrix and each row has values for the arguments of v4. Then .[v4;]peach m will apply v4 to each list of arguments.

Alternatively, suppose t is a table in which columns b, c, and a are arguments of v3. Then .[v3;]peach flip t `b`c`a will apply v3 to the arguments in each row of t.

Blocked within peach

hopen socket
websocket open
socket broadcast (25!x)
amending global variables
load master decryption key (-36!)

And any system command which might cause a change of global state.

Generally, do not use a socket within peach, unless it is encapsulated via one-shot sync request or HTTP client request (TLS/SSL support added in 4.1t 2023.11.10). Erroneous socket usage is blocked and signals a nosocket error.

If you are careful to manage your file handles/file access so that there is no parallel use of the same handle (or file) across threads, then you can open and close files within peach.

Streaming execute (-11!) should also be fine. However updates to global variables are not possible, so use cases might be quite restricted within peach.