
При разработке стратегий на FMZ с использованием языка JavaScript архитектура стратегии опрашивается. Если есть параллельный сценарий проектирования, то этоexchange.GoФункции используются для выполнения одновременных вызовов некоторых интерфейсов, тем самым удовлетворяя потребности некоторых одновременных сценариев. Однако, если вы хотите создать отдельный поток для выполнения серии операций, это невозможно. Например, как в Python, используйтеthreadingБиблиотека используется для параллельного проектирования.
Исходя из этого спроса, платформа FMZ модернизировала базовую систему. В язык JavaScript также добавлена настоящая поддержка многопоточности. Подробные характеристики включают в себя:
Далее редактор пошагово объяснит вам каждую функцию.
__ThreadФункция может создать поток для одновременного выполнения функции. Например, вам нужно создать параллельную функциюfunc1,func1Что делает эта функция? Мы можем позволить ему накапливаться от 0 до 9. Чтобы увидеть этот постепенный процесс накопления, используйте цикл for в функции func1, чтобы каждый раз делать паузу (функция Sleep используется для сна на определенное количество миллисекунд) на определенный период времени.
function func1(sleepMilliseconds) {
var sum = 0
for (var i = 0 ; i < 10 ; i++) {
sum += i
Sleep(sleepMilliseconds)
Log("sum:", sum)
}
return sum
}
function main() {
// 使用__Thread函数并发创建一个线程,参数200即为func1函数的参数,
// 如果func1函数有多个参数,这里就具体传对应的参数
var thread1Id = __Thread(func1, 200)
// 这里需要等待线程Id为thread1Id的线程执行结果,否则main函数执行完就直接释放所有线程
var ret = __threadJoin(thread1Id)
Log("ret:", ret)
}
В реальных сценариях приложений мы можем выполнять параллельные http-запросы следующим образом:
function main() {
let threads = [
"https://www.baidu.com",
"https://www.163.com"
].map(function(url) {
return __Thread(function(url) {
Log("GET", url)
return HttpQuery(url)
}, url)
})
threads.forEach(function(tid) {
Log(__threadJoin(tid))
})
}
В приведенном выше примере мы наконец использовали его в основной функции.__threadJoinФункция ожидания завершения выполнения параллельных потоков, переменнаяretперенимать__threadJoinВозвращаемое значение функции. Мы выводим это возвращаемое значение и наблюдаем конкретные результаты выполнения этого параллельного потока.
// id:线程ID,terminated:是否被强制停止,elapsed:耗时(纳秒),ret:线程执行函数的返回值
ret: {"id":1,"terminated":false,"elapsed":2004884301,"ret":45}
function func1(sleepMilliseconds) {
var sum = 0
for (var i = 0 ; i < 10 ; i++) {
sum += i
Sleep(sleepMilliseconds)
Log("sum:", sum)
}
return sum
}
function main() {
var thread1Id = __Thread(func1, 200)
Sleep(1000)
retThreadTerminate = __threadTerminate(thread1Id)
Log(retThreadTerminate) // true
}
Если снова обратиться к предыдущему примеру, после создания потока вы можете принудительно завершить выполнение потока после ожидания в 1 секунду.
В основном используется межпотоковое взаимодействие__threadPostMessageФункции и__threadPeekMessageфункция. Давайте рассмотрим следующий простой пример:
function func1() {
var id = __threadId()
while (true) {
var postMsg = "来自id:" + id + "的线程函数func1的消息"
__threadPostMessage(0, postMsg) // 发送消息到主线程
var peekMsg = __threadPeekMessage() // 接收来自其它线程的消息
Log(peekMsg)
Sleep(5000)
}
}
function main() {
var threadId = __Thread(func1)
while (true) {
var postMsg = "来自主线程的main函数的消息"
__threadPostMessage(threadId, postMsg)
var peekMsg = __threadPeekMessage()
Log(peekMsg, "#FF0000") // #FF0000 , 设置日志为红色用于区分
Sleep(5000)
}
}
__threadPostMessageФункция используется для отправки сообщения в поток. Первый параметр — это идентификатор конкретного потока, в который отправляется сообщение, а второй параметр — это отправляемое сообщение, которое может быть строкой, числом, массив, объект JSON и т. д. Вы можете отправлять сообщения в основной поток в функции параллельного потока. Идентификатор основного потока определяется как 0.
__threadPeekMessageФункция используется для мониторинга сообщений, отправленных потоком. Вы можете установить тайм-аут (в миллисекундах) или установить его на 0, чтобы заблокировать поток и отслеживать его до тех пор, пока не появится сообщение, прежде чем вернуться.
Конечно, за исключением параллельных потоков, взаимодействующих с основным потоком. Конкурентные потоки также могут напрямую взаимодействовать друг с другом.
В приведенном выше примере с использованиемvar id = __threadId(),__threadId()Функция может получить идентификатор текущего потока.
Помимо связи между потоками, для взаимодействия можно также использовать общие переменные.
function testFunc() {
__threadSetData(0, "testFunc", 100) // 储存在当前线程环境,键值对 testFunc : 100
Log("testFunc执行完毕")
}
function main() {
// threadId为1 ,创建的threadId为1的线程会先执行完,只要线程资源没有被回收,线程本地储存的变量就有效
var testThread = __Thread(testFunc)
Sleep(1000)
// 输出 in main, get testFunc: 100
Log("in main, get testFunc:", __threadGetData(testThread, "testFunc")) // 取出键名为testFunc的值
}
Выше представлена простая демонстрация всех функций.