1
liangmishi OP 代码是这样的:
from multiprocessing.dummy import Pool pool = Pool(10) for i in range(10): pool.apply_async(mytest, args=(test)) pool.close() pool.join() |
2
fiht 2016-08-14 20:52:52 +08:00
因为 线程调度,主线程被挂起了,无法接收系统传来的 KeyboardInterrupt 。
|
3
ChopinWong 2016-08-14 21:11:51 +08:00
killall python
|
4
liangmishi OP @fiht 找了相关的资料,确实如此。 pool.apply_async(mytest, args=(test)) 加一个 get()来接收超时时间可解
@ChopinWong 谢谢~ 我刚刚开始也是没想到用 kill 直接重启了。。 |
5
cloverstd 2016-08-14 21:59:22 +08:00 1
我最近也在做多线程(进程)相关的程序,我的解决办法是继承 threading.Thread 或者 multiprocessing.Process
然后在 run 里面通过 self._running 来判断是否继续运行,然后 self._running 的值由主线程传递进来 所以我在主进程里捕捉 KeyboardInterrupt ,然后依次将子线程 stop 掉 |
6
skydiver 2016-08-14 22:19:46 +08:00 1
通用做法是主线程捕获信号并 set 个 flag ,然后子线程检查这个 flag 并自己退出循环。
多进程的话,应该是主进程捕获信号然后给子进程发信号吧 |
7
wevsty 2016-08-15 00:02:31 +08:00
我用 multiprocessing pool 写的多进程代码会莫名其妙的出现 error 或者崩溃,还在和社区的人反馈。汗一个。。。
|
9
wevsty 2016-08-15 09:40:17 +08:00
@suueyoung 我正在头疼是什么问题, error 的部分是标准库里面的实现,并非直接是我代码中的问题。但是有几点,首先 python.exe 有 crash 的现象,这个 crash 的锅我不背,无论什么时候解释器 crash 都是有问题的。
然后 error 报错的位置在 lib\multiprocessing\connection.py", line 280, in _send_bytes ov, err = _winapi.WriteFile(self._handle, buf, overlapped=True) TypeError: WriteFile() argument 1 must be int, not None self._handle 这东西根本不是我传入的参数, lib 里面自己处理的,我实在不明白这代码哪里有问题 G_Process_Lock = multiprocessing.Manager().Lock() 然后再其他进程里面 with G_Process_Lock: pass 然而这代码就是有概率在 with 退出的时候出现上面的 error 。如果有人能告诉我是哪里出现了问题,我非常感谢。 |
10
xiaolee59 2016-08-15 11:12:31 +08:00 1
https://cyrusin.github.io/2016/05/25/python20160525/
“从 Ctrl-C 看 Python 多线程的信号处理” 不知道你的问题是不是踩到了 Python 多线程问题的一个坑, ctrl-c 问题涉及到 Python 的多线程的信号处理的问题,可以看我的文章,理解下。 |
11
hitmanx 2016-08-15 13:00:16 +08:00 1
python 的多线程用的不多不太了解:(,不过 general 的多线程和信号的问题可以看看 APUE 里 Thread Control 那章,专门有一节是讲多线程的情况下的 signal 的处理的,叫 threads and signals.虽然是 POSIX 的,但是很多思路是一样的。
|
13
liangmishi OP |
14
wwqgtxx 2016-08-15 15:19:04 +08:00
@xiaolee59 可以考虑在 signal_handler(signum, frame)中直接执行 os._exit(0),这样就不用考虑线程会不会退出了
|
15
EchoUtopia 2016-08-15 18:50:46 +08:00 1
|