[問題] 停止正在執行 3rd party lib 的 thread
程式執行登入時需要在另一個裝置做一些認證
在認證完成前原本程式的 UI 可以取消登入
但是此時做認證的 thread block 在一個 3rd party lib 等待認證回應的 function
所以不能用一般在 thread 下 check event 的方式來決定要不要離開
Google 了一下,找到利用 thread-id raise exception 的方式
http://stackoverflow.com/questions/323972/is-there-any-way-to-kill-a-thread-in-python
shorten:
http://goo.gl/MRRDFA
但是怎麼試也無法成功...都是 invalid thread ID
嘗試用文中的 walk 找 tid,或是用 threading.current_thread().ident
得到的都是一個很長的數字,也許不是真正的 tid?
所以試着用 system call 的方式
libc = ctypes.cdll.LoadLibrary('libc.so.6')
tid = libc.syscall(186)
的方式來得到 tid
但是丟進去 PyThreadState_SetAsyncExc 裏還是 invalid tid...
也就是 return 是 0
請問該如何得到正確的 tid?
或是有其他方式可以 kill thread? (最好是 portable 的)
也順便問問是否有其他更好的做法可以避免需要 kill thread?
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.34.244.41
※ 文章網址: http://www.ptt.cc/bbs/Python/M.1408672998.A.6E2.html
※ 編輯: carylorrk (1.34.244.41), 08/22/2014 10:20:57
推
08/22 20:45, , 1F
08/22 20:45, 1F
→
08/22 20:45, , 2F
08/22 20:45, 2F
→
08/22 20:46, , 3F
08/22 20:46, 3F
→
08/22 20:46, , 4F
08/22 20:46, 4F
→
08/22 20:46, , 5F
08/22 20:46, 5F
→
08/22 20:46, , 6F
08/22 20:46, 6F
→
08/22 20:46, , 7F
08/22 20:46, 7F
→
08/22 20:46, , 8F
08/22 20:46, 8F
→
08/22 20:47, , 9F
08/22 20:47, 9F
→
08/22 20:47, , 10F
08/22 20:47, 10F
→
08/22 20:47, , 11F
08/22 20:47, 11F
→
08/22 20:47, , 12F
08/22 20:47, 12F
→
08/22 20:47, , 13F
08/22 20:47, 13F
→
08/22 20:47, , 14F
08/22 20:47, 14F
→
08/22 20:48, , 15F
08/22 20:48, 15F
→
08/22 20:48, , 16F
08/22 20:48, 16F
→
08/22 20:49, , 17F
08/22 20:49, 17F
→
08/22 20:50, , 18F
08/22 20:50, 18F
→
08/22 20:51, , 19F
08/22 20:51, 19F
推
08/22 20:53, , 20F
08/22 20:53, 20F
→
08/22 20:55, , 21F
08/22 20:55, 21F
→
08/22 20:55, , 22F
08/22 20:55, 22F
→
08/22 20:57, , 23F
08/22 20:57, 23F
感謝你的回覆,後來發現裏面推文就有了 忘記來這邊改XD
果然發文之前要好好爬文啊~
擺到另外一個 process 的方式下面推文也有,不過感覺其實是差不多的~
至於改 code... trace 了一下裏面有使用 requests 這個 lib
用 session.get() 經過 verification 抓 json 會造成 block
比較好的方式是改用 async 的方法再去 busy wait
要中斷就 set flag 結束 while loop 這樣 XD?
可惜不能 merge 回去,因爲這段 code 最近因爲被某 L 社要求撤掉了 Orz
※ 編輯: carylorrk (1.34.244.41), 08/23/2014 00:07:49
推
08/23 00:14, , 24F
08/23 00:14, 24F
→
08/23 00:15, , 25F
08/23 00:15, 25F
→
08/23 00:15, , 26F
08/23 00:15, 26F
→
08/23 00:15, , 27F
08/23 00:15, 27F
→
08/23 00:16, , 28F
08/23 00:16, 28F
→
08/23 00:18, , 29F
08/23 00:18, 29F
推
08/23 00:21, , 30F
08/23 00:21, 30F
→
08/23 00:21, , 31F
08/23 00:21, 31F
→
08/23 00:23, , 32F
08/23 00:23, 32F
→
08/23 00:24, , 33F
08/23 00:24, 33F
→
08/23 00:27, , 34F
08/23 00:27, 34F
瞭解~
不過如果用 async raise 還會有 GIL 的問題嗎?
畢竟不是 kill thread,應該會 release GIL 吧~
※ 編輯: carylorrk (1.34.244.41), 08/23/2014 01:16:53
推
08/23 01:35, , 35F
08/23 01:35, 35F
→
08/23 01:37, , 36F
08/23 01:37, 36F
→
08/23 01:38, , 37F
08/23 01:38, 37F
推
08/23 01:58, , 38F
08/23 01:58, 38F
→
08/23 01:59, , 39F
08/23 01:59, 39F
→
08/23 02:01, , 40F
08/23 02:01, 40F
→
08/23 02:02, , 41F
08/23 02:02, 41F
→
08/23 02:03, , 42F
08/23 02:03, 42F
→
08/23 02:05, , 43F
08/23 02:05, 43F
→
08/23 02:05, , 44F
08/23 02:05, 44F
→
08/23 02:07, , 45F
08/23 02:07, 45F
原來如此!如果沒有解說我還真把它當神奇的黑魔法 XDD
看來還需要研究一下細節,說不定哪天手上沒有 source code 就用的到了XD
感謝~
※ 編輯: carylorrk (1.34.244.41), 08/23/2014 03:10:49