Membuat program dasar benar-benar dijalankan secara serentak, menambah sokongan pelbagai benang di dasar sistem untuk dasar JavaScript

Penulis:Pencipta Kuantiti - Impian Kecil, Dicipta pada: 2023-03-02 14:19:15, Dikemas kini pada: 2024-03-20 15:06:41

让策略程序真正并发执行,给JavaScript策略增加系统底层多线程支持

Membuat program dasar benar-benar dijalankan secara serentak, menambah sokongan pelbagai benang di dasar sistem untuk dasar JavaScript

Apabila menggunakan bahasa JavaScript untuk membangunkan dasar di FMZ, kerana struktur dasar adalah rundingan; jika terdapat senario yang dirancang secara serentak, ia adalah melaluiexchange.GoFungsi untuk melakukan panggilan serentak beberapa antara muka, sehingga memenuhi keperluan beberapa senario serentak. Tetapi tidak dapat dilaksanakan jika ingin membuat satu benang secara berasingan untuk melakukan satu siri operasi, seperti bahasa Python, menggunakanthreadingSaya telah membuat beberapa reka bentuk serentak.

Berdasarkan keperluan ini, FMZ platform menaik taraf asas sistem. Ia juga menambah sokongan multi-threaded sebenar untuk bahasa JavaScript. Fungsi terperinci termasuk:

  • Mencipta benang pada masa yang sama untuk menjalankan fungsi tersuai.
  • Komunikasi antara benang.
  • Variabel yang disimpan di antara benang yang dikongsi.
  • Menunggu untuk menjalankan thread untuk menamatkan sumber pemulihan dan mengembalikan hasil pelaksanaan.
  • "Mengharuskan sambungan dan mengitar semula sumber".
  • Mendapatkan ID benang semasa dalam fungsi pelaksanaan benang yang disatukan.

Di bawah ini, kami akan memaparkan cara anda memahami setiap fungsi secara individu.

Mencipta fungsi tersuai untuk dijalankan pada masa yang sama


fungsi1 ((tidurMilisetik) { jumlah var = 0 untuk (var i = 0 ; i < 10 ; i++) { jumlah += i Tidur ((tidurMilliseconds) Log ((jumlah:, jumlah) {}

return sum

}

fungsi utama (() { // Menggunakan fungsi__Thread untuk mencipta satu utas secara serentak dengan parameter 200 sebagai parameter fungsi func1, // Jika fungsi func1 mempunyai beberapa parameter, di sini adalah parameter yang sesuai var thread1Id = __Thread ((func1, 200)

// 这里需要等待线程Id为thread1Id的线程执行结果,否则main函数执行完就直接释放所有线程
var ret = __threadJoin(thread1Id)
Log("ret:", ret)

}


实际应用场景中,我们可以这样并发进行http请求:

Fungsi utama biar benang = [ https://www.baidu.com”, “https://www.163.com”].map(fungsi(url) { KembaliThread (fungsi) Log ((GET, url) Kembali HttpQuery(url) }, url) {y: i} thread.forEach fungsi Log (((threadJoin ((tid)) {y: i} { C: $ 00FFFF }


### 等待线程执行结束回收资源并返回执行结果

以上例子中我们在main函数中最后使用了```__threadJoin```函数来等待并发的线程执行完毕,变量```ret```接收```__threadJoin```函数的返回值,我们打印了这个返回值,可以观察这个并发的线程执行的具体结果。

// id: ID benang, terminated: apakah dipaksa berhenti, elapsed: memakan masa ((nsec), ret: nilai pulangan fungsi pelaksanaan benang ret: {id:1,terminated:false,elapsed:2004884301,ret:45}


### 强制结束线程,并回收资源

fungsi1 ((tidurMilisetik) { jumlah var = 0 untuk (var i = 0 ; i < 10 ; i++) { jumlah += i Tidur ((tidurMilliseconds) Log ((jumlah:, jumlah) {}

return sum

}

Fungsi utama var thread1Id = __Thread ((func1, 200) Tidur ((1000) retThreadTerminate = __threadTerminate ((thread1Id) Log ((retThreadTerminate) // benar {}


还是以刚才的例子,在创建线程后,可以在等待1秒之后就强制终止线程执行。

### 线程间通信

线程间通信主要使用```__threadPostMessage```函数和```__threadPeekMessage```函数。我们来看以下简单例子:

fungsi1 (() { var id = __threadId ((() while (true) { var post Msg = bar mesej dari id: bar + id + bar fungsi benang func1 __threadPostMessage ((0, postMsg) // menghantar mesej ke benang utama var peekMsg = __threadPeekMessage() // Menerima mesej dari utas lain Log (peekMsg) Sleep ((5000) {C:$0000FF} {C:$0000FF}

Fungsi utama var threadId = __Thread(func1)

while (true) {
    var postMsg = "来自主线程的main函数的消息"
    __threadPostMessage(threadId, postMsg)
    var peekMsg = __threadPeekMessage()
    Log(peekMsg, "#FF0000")                     // #FF0000 , 设置日志为红色用于区分
    Sleep(5000)
}

}


```__threadPostMessage```函数用于向某个线程发送消息,第一个参数是具体发送到哪个线程的ID,第二个参数是发送的消息,可以是字符串、数值、数组、JSON对象等。可以在并发的线程函数中向主线程发送消息,主线程的ID定义为0。

```__threadPeekMessage```函数用于监听某个线程发送来的消息, 可以设置超时时间(毫秒数),也可以设置为0表示阻塞,一直监听到有消息才返回。

当然,除了并发的线程和主线程通信。并发的线程之间也可以直接相互通信。

### 在并发的线程执行函数中获取当前线程ID

在上面的例子中,使用了```var id = __threadId()```,```__threadId()```函数可以获取当前线程的ID。

### 共享线程间储存的变量

除了线程间的通信,还可以使用共享变量进行交互。

function test Func ((() { __threadSetData ((0, testFunc, 100) // Menyimpan persekitaran benang semasa, nilai kunci untuk testFunc: 100 Log ((testFunc menjalankan terminasi log) {C:$0000FF}

fungsi utama (() { // threadId adalah 1, dan threadId yang dicipta adalah 1 akan dijalankan terlebih dahulu, selagi sumber thread tidak diambil semula, dan pemboleh ubah yang disimpan secara tempatan pada thread adalah sah var testThread = __Thread ((testFunc)

Sleep(1000)

// 输出 in main, get testFunc: 100
Log("in main, get testFunc:", __threadGetData(testThread, "testFunc"))   // 取出键名为testFunc的值

} “`

Ini adalah demonstrasi ringkas semua fungsi.


Kandungan berkaitan

Lebih lanjut

Pisau tulangMenerbitkan cetakan ini: Error ReferenceError: '__Thread' is not defined at main (__FILE__:5)

Pisau tulangMengumpul dan Belajar

Pencipta KuantitiPenguatkuasa Peningkatan