# Κατεβάστε τα αρχεία FlowStream και εκτελέστε απομονωμένους εργαζόμενους

> Εκτελέστε το ίδιο αξιόπιστο σχήμα FlowStream όπως ένα εργάτη thread και μια διαδικασία παιδιών, φορτίστε .flow αρχεία και αφαιρέστε παραδείγματα.

Framework: total5
Product: Total.js 5 (total5@0.0.19)
Language: el
Content-SHA256: fb1b013815a277b6dea08767661dae873bfe736b8c42f7aa14ab750ef6f37b87
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: total5-installed@total5@0.0.19
Review: not-recorded

Το `Flow.init(directory, callback)` διαβάζει αρχεία JSON `.flow` και φορτώνει κάθε αξιόπιστο σχήμα· τα ονόματα που περιέχουν `-bk` ή `_bk` παραλείπονται. Ο προεπιλεγμένος φάκελος είναι `flowstreams/`. Το `Flow.load(schema, callback)` δέχεται επίσης σε αυτή την έκδοση `worker:'worker'` για νήμα worker του Node και `worker:true` για θυγατρική διεργασία. Οι workers του Flow έχουν χωριστά καθολικά: μην περιμένετε τα αντικείμενα `MAIN` του γονέα ή τα closures του να είναι διαθέσιμα μέσα σε μια συνιστώσα.

Ο σχεδιαστής οπτικής ροής και το ειδικό του UI χωρίζονται από αυτό το backend API. Τα συστατικά είναι εκτελεστικό αξιόπιστο κώδικα. οι εργαζόμενοι είναι η απομόνωση της διαδικασίας/δελφού, όχι ένα μη αξιόποινο κωδικό sandbox.

```js controllers/flows.js
exports.install = function() {
	ROUTE('GET /flow-workers/', exercise);
};
async function exercise($) {
	var ids = [];
	try {
		var source = '<script total>exports.id="echo";exports.name="Echo";exports.inputs=[{id:"input",name:"Input"}];exports.config={prefix:""};exports.make=function(instance,config){instance.message=function($){$.data=config.prefix+String($.data);$.destroy();};};</script>';
		var out = [];
		for (var worker of ['worker', true]) {
			var id = worker === true ? 'file-process' : 'file-thread';
			ids.push(id);
			var schema = { id: id, name: id, worker: worker, components: { echo: source }, design: { a: { id: 'a', component: 'echo', config: { prefix: 'one:' }, connections: {} } }, variables: {} };
			var dir = PATH.root(id);
			F.Fs.mkdirSync(dir, { recursive: true });
			F.Fs.writeFileSync(dir + '/demo.flow', JSON.stringify(schema));
			F.Fs.writeFileSync(dir + '/ignored-bk.flow', JSON.stringify({ id: 'must-not-load' }));
			await new Promise(resolve => Flow.init(dir, resolve));
			var instance = Flow.instances[id];
			var first = await new Promise((resolve, reject) => instance.exec({ id: 'a', data: 'hello', callback: (err, msg) => err ? reject(err) : resolve(msg.data) }));
			instance.reconfigure('a', { prefix: 'two:' });
			var second = await new Promise((resolve, reject) => instance.exec({ id: 'a', data: 'again', callback: (err, msg) => err ? reject(err) : resolve(msg.data) }));
			out.push({ worker: worker, first: first, second: second, isolated: !!instance.flow.isworkerthread });
			Flow.remove(id);
		}
		$.json({ results: out, removed: ids.every(id => !Flow.instances[id]), backupSkipped: !Flow.instances['must-not-load'] });
	} catch (e) { $.invalid(e); }
	finally { for (var id of ids) if (Flow.instances[id]) Flow.remove(id); }
}
```
