跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • apply_async 如何调用 class 而不是 func
未分類
20 5 月 2020

apply_async 如何调用 class 而不是 func

apply_async 如何调用 class 而不是 func

資深大佬 : smallgoogle 3

代码:

from multiprocessing import Pool import os, time  class tasktest():     def __init__(self, msg):         self.msg = msg      def run(self):         # printxx()         print("=== 主进程号%d, 进程号为%d" % (os.getppid(), os.getpid()))         # print(self.msg)  def throw_error(e):     print('=========== Error Start ===========')     print("主进程号%d, 进程号为%d" % (os.getppid(), os.getpid()))     print('=========== Error End ===========')   def worker(msg):     t_start = time.time()     print("开始执行,主进程号%d,进程号为%d" % (os.getppid(), os.getpid()))     tasktest(msg).run()     t_stop = time.time()     print("执行完毕,耗时%0.2f" % (t_stop - t_start))   def start(d):     po = Pool(10)     d_list = d     for_times = 0     while len(d_list) > 0:         x = 0         for i in list(d_list):             if x < 2:                 po.apply_async(worker, (i, ), error_callback=throw_error)                 d_list.pop(0)                 x+=1             else:                 break         for_times += 1     po.close()     po.join()    if __name__ == '__main__':     d = [{         "id": 1,     }, {         "id": 2,     }, {         "id": 3,     }, {         "id": 4,     }]     start(d) 

我当前是的 apply_async 是调用 worker 方法 然后 worker 再调用 tasktest
这样的话,我就不能在 error_callback 异常里处理 tasktest 的异常进程了。

那么如何 apply_async 可以直接调用 tasktest 呢? 比如: po.apply_async(tasktest.run(), (i, ), error_callback=throw_error)
这样我就可以处理异常子进程了。
可是这个写法是不正确的,所以这个位置应该如何写呢?
我尝试过谷歌和百度,给出的方法都是 func,并没有说如何 class 这样调用。

自己截帖一下:
po.apply_async(Baidu(i).run, error_callback=throw_error)
原来酱紫即可, 可是问题来了, 这样还是没办法在 throw_error 获取到子进程的 pid

大佬有話說 (4)

  • 資深大佬 : wuyifar

    直接在 worker 中 try 不行吗

  • 資深大佬 : wellsc

    再包装一个方法?

  • 資深大佬 : gnozix

    把 run 方法改成 __call__ 方法,然后修改成 `po.apply_async(tasktest(i), error_callback=throw_error)` 就可以了

  • 資深大佬 : yyb123456789

    你这是里面没有触发错误去执行回调,raise 一个错误就好

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具