php多线程抓取多个网页(publicstaticexternintSetProcessWorkingSetSize比之前的耗时长一些--解决思路-)

优采云 发布时间: 2021-10-29 08:09

  php多线程抓取多个网页(publicstaticexternintSetProcessWorkingSetSize比之前的耗时长一些--解决思路-)

  ThreadThread1=newThread(newThreadStart(Function A));

  线程1.开始();

  }

  -------------------------------------------------

  然后每隔一段时间(几乎每500毫秒一次)调用函数B,运行一段时间后报System.OutOfMemoryException。但是定义线程调用A,执行完后应该结束,应该释放资源,内存溢出。

  PS:我试过指定线程大小 ThreadThread1=newThread(newThreadStart(function A), 1024*256); 也会报内存溢出错误,但是比上一个耗时更长

  ------解决方案----------------------

  1、优化代码逻辑,将循环中每次需要申请内存的操作提取出循环外,每次共享一块内存;(并非每个内存使用都可以做到这一点)

  2. 手动GC。. . (性能低,但可以顺利处理,比如100个周期手动恢复一次)

  3.限制内存使用频率。如果代码环境代码环境是多线程导致内存过多,限制线程数,如果是循环引起的,降低循环速度,比如加一个thread.sleep等;

  1 效果最好,但并不总是适用, 2 代码简单,但性能损失高, 3 比较温和,肯定可用,但会降低执行效率;

  这是之前给别人的答案,内存溢出的处理方式,不过是循环,你是多线程的,性质是一样的

  ------解决方案----------------------

  [System.Runtime.InteropServices.DllImport("kernel32.dll",EntryPoint="SetProcessWorkingSetSize")]

  publicstaticexternintSetProcessWorkingSetSize(IntPtrprocess,intminSize,intmaxSize);

  ///

  ///释放内存

  ///

  publicstaticvoidClearMemory()

  {

  GC.Collect();

  GC.WaitForPendingFinalizers();

  if(Environment.OSVersion.Platform==PlatformID.Win32NT)

  {

  表单2.SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle,-1,-1);

  }

  }

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线