,您仍然可以重複使用多次的聯繫,但請注意,連接不是線程安全的,所以必須在同一個連接
import MySQL
import PerfectThread
#if os(Linux)
import Glibc
#else
import Darwin
#endif
let mysql = MySQL()
let lock = Threading.Lock()
var jobs = 10
func now(_ id: Int) {
print("Job Now #", id)
lock.doWithLock {
let x = mysql.query(statement: "SELECT now() as time")
guard x, let y = mysql.storeResults(),
let row = y.next() else {
print(mysql.errorMessage())
return
}
print(row[0] ?? "Now() FAILED")
y.close()
jobs -= 1
}
}
func user(_ id: Int) {
print("Job Usr #", id)
lock.doWithLock {
let x = mysql.query(statement: "select User from user")
guard x, let y = mysql.storeResults(),
let row = y.next() else {
print(mysql.errorMessage())
return
}
print(row[0] ?? "User() FAILED")
y.close()
jobs -= 1
}
}
_ = mysql.setOption(.MYSQL_SET_CHARSET_NAME, "utf8mb4")
guard mysql.connect(host: "127.0.0.1", user: "root", password: "your pass", db: "mysql") else {
print(mysql.errorMessage())
exit(0)
}
jobs = 10
for id in 0 ..< 5 {
Threading.dispatch {
now(id)
}
Threading.dispatch {
user(id)
}
}
while jobs > 0 {
sleep(1)
}
mysql.close()
在這個例子上添加線程鎖,兩個功能共享相同的連接並運行幾次。沒關係。但是,如果每個函數都在單獨的線程中運行,則會導致失敗。
感謝您對此的迴應。我不知道你對Perfect項目的參與,但是你知道是否有計劃讓這個接口是線程安全的嗎?爲了服務器的目的,我希望只打開一個連接,我認爲這會比根據REST請求打開一個新連接更有效率。 –
實際上,您不必等待來自Perfect的任何更新 - 添加線程鎖定是非常容易的,請檢查下面的要點,您可以安全地在同一連接上使用多個線程: https://gist.github.com/RockfordWei/6f7ab9d66e975ce83b09db5b21c2d726 – PerfectlyRock