1
yuzhibott OP num = 0
def test1(*data): global num i = data[0] while True: if num == 10: num = 0 break print(i) num += 1 time.sleep(2) def test2(*data): i = data[0] threading.Thread(target=test1, args=(i,)).start() print("done") pool = multiprocessing.Pool(processes=5) for j in range(2): pool.apply_async(test2, (j,)) |
2
yuzhibott OP 大概代码如上,不能用 join(),因为实际中是多任务定时处理,每个任务时间不一样
|
3
yuzhibott OP num = 0
def test1(*data): global num i = data[0] while True: if num == 10: num = 0 break print(i) num += 1 time.sleep(2) def test2(*data): i = data[0] threading.Thread(target=test1, args=(i,)).start() print("done") pool = multiprocessing.Pool(processes=5) for j in range(2): pool.apply_async(test2, (j,)) |
4
shibingsw 2017-09-25 17:57:14 +08:00
join 和时间长短有什么关系。。
|
6
clino 2017-09-25 18:00:30 +08:00
"不能用 join(),因为实际中是多任务定时处理,每个任务时间不一样"
join 做了等待的时候,你如果不用,那么就要自己来实现这个等待的部分,否则不等待就是直接退出了嘛 |
7
scriptB0y 2017-09-25 18:02:27 +08:00
同意 #6
join 阻塞主线程,如果不想用 join 的话,必须让主线程的运行时间最长,否则主线程跑完进程结束 |
9
ryd994 2017-09-26 05:07:54 +08:00
不能用 join,就不能检查 is_alive 了?
再说了,谁说不能 join ?一个一个 join 过去就行,全 join 完退出 |
10
justou 2017-09-26 08:51:32 +08:00
如果不是创建的后台线程, 不在主线程 join 的话, 主线程结束, 子线程就强制退出了;
如果是后台线程, 主线程结束后, 子线程自个跑自个的: from threading import Thread from time import sleep def work(): sleep(5) with open("test.txt", 'w') as fout: pass if __name__ == "__main__": t = Thread(target=work) t.setDaemon(True) t.start() |
11
petelin 2017-09-27 13:25:01 +08:00
@justou 后台线程作用是, 当主线程退出的时候, 不用管他们(那他们能欢快的在后台运行吗? 看进程, 进程都退出了,直接被干掉). 反而非后台进程, 主进程即使不 join, 退出之前也要等子线程结束.
所以还是要学习一个. |
12
petelin 2017-09-27 13:36:56 +08:00
那么这段代码问题是, 主进程跑完之后, 所有子进程都被干掉了.无论你子进程在干什么, 直接被干掉.
所有需要在主进程加一段代码 pool.close() pool.join() 这样看起来就完了, 主进程会等待子进程完成, 而子进程会等待线程完成 可是子进程不会等待线程完成, 所以 t.start() t.join() 那么为什么子进程不会等待非守护线程结束呢??? 我去学习一个 |
13
petelin 2017-09-27 14:03:54 +08:00
@petelin 说的有点问题, 并不是主线程等待子线程都完成在退出(那是 join 干的事), 而是 python 解释器保证 当没有活跃的进程之后才退出(所以主线程先退出, 子线程继续执行, 知道完成 python 进程退出是有可能的).
|