文章目錄
- 測試用的代碼
- 錯誤
- 解決方法
測試用的代碼
下面每一個對應一個jupyter notebook的單元格
import time
from multiprocessing import Process, Queue
def generator():c = 0while True:time.sleep(1.0) # read somethingyield cc += 1
%%timeds = generator()
for i in range(3):item = next(ds)time.sleep(1.0) # do somethingprint(item)
0
1
2
CPU times: user 3.27 ms, sys: 456 μs, total: 3.73 ms
Wall time: 6.01 s
def kernel(func, q: Queue):ds = func()while True:item = next(ds)q.put(item)
def multi_generator(func):q = Queue()p = Process(target=kernel, args=(func, q))p.start()while True:item = q.get()yield item
在windows下運行這個單元格的話,會一直顯示在運行,
%%timeds = multi_generator(generator)
for i in range(3):item = next(ds)time.sleep(1.0)print(item)
錯誤
運行上面的代碼,后臺會報如下錯
Traceback (most recent call last):File "<string>", line 1, in <module>File "D:\Anaconda\envs\AIE31\lib\multiprocessing\spawn.py", line 105, in spawn_mainexitcode = _main(fd)File "D:\Anaconda\envs\AIE31\lib\multiprocessing\spawn.py", line 115, in _mainself = reduction.pickle.load(from_parent)
AttributeError: Can't get attribute 'kernel' on <module '__main__' (built-in)>
解決方法
1、些處解決方案,是利用Windows 10 下的WSL的Linux系統解決的。
怎樣配置WSL,請參考鏈接https://blog.csdn.net/jasneik/article/details/123782018
直接打開Ubuntu 控制臺,運行jupyter notebook,一般不會像Windows下的會自動跳轉,可以把jupyter notebook含token的鏈接拷貝到瀏覽器打開。類似如下的鏈接
然后把上面的代碼拷,再運行,就OK了。
%%timeds = multi_generator(generator)
for i in range(3):item = next(ds)time.sleep(1.0)print(item)
0
1
2
CPU times: user 9.26 ms, sys: 1.38 ms, total: 10.6 ms
Wall time: 4.06 s
2、可以參考此方面,是把方法寫到臨時文件(我沒有試過)
https://blog.csdn.net/e274794140/article/details/87286190