1. A method of performing dataflow processing the method comprising: representing a first asynchronous processing node as a first future, the first future being a returnable object representing the end of a lifecycle of processing of the first asynchronous processing node; representing one or more other asynchronous nodes as a one or more other futures, the one or more other futures being returnable objects representing the asynchronous completion of one or more nodes' processing; at the first node, determining that processing has completed at the one or more other asynchronous nodes; at the first node, determining that processing has completed at the first node; and as a result of the first node determining that processing has completed at the one or more other asynchronous nodes and the processing has completed at the first node, the first node providing a single composite future that represents the first future and the one or more other futures as a single composite future, the single composite future being a single returnable object representing completion of processing of the combination of the first asynchronous processing node and the one or more other asynchronous nodes.