# Best place to run system.serial.readBytes() in gateway scope for unsolicited data

**URL:** <https://forum.inductiveautomation.com/t/best-place-to-run-system-serial-readbytes-in-gateway-scope-for-unsolicited-data/37248>\
**Category:** Ignition\
**Created:** [July 31, 2020, 8:49am UTC](https://forum.inductiveautomation.com/t/best-place-to-run-system-serial-readbytes-in-gateway-scope-for-unsolicited-data/37248 "2020-07-31T08:49:21Z")\
**Posts on this page:** 1\
**Showing post:** 2

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [July 31, 2020, 12:27pm UTC](https://forum.inductiveautomation.com/t/best-place-to-run-system-serial-readbytes-in-gateway-scope-for-unsolicited-data/37248/2 "2020-07-31T12:27:04Z")

</div>

A long-lived background thread that blocks on readBytes() is the only reliable method. But see this comment:

> [@Managing multiple asynchronous threads](http://forum.inductiveautomation.com/t/managing-multiple-asynchronous-threads/37185/2):
>
> To manage long-running jython threads through scripting restarts, you need to: Place the thread object in a dictionary that retains its content through script restarts. I used to recommend the dictionary from system.util.getGlobals(), but that is no longer suitable. I created a free [Life Cycle Module](http://forum.inductiveautomation.com/t/system-util-getglobals-not-persisted-across-designer-save/33869/14) that provides such dictionaries going forward. Write the asynchronous function’s loop so that it regularly checks [Thread.interrupted()](https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html#interrupted--), particularly after any java I/O operations. Clean up …

---

_[View the full topic](https://forum.inductiveautomation.com/t/best-place-to-run-system-serial-readbytes-in-gateway-scope-for-unsolicited-data/37248)._
