我有一个使用线程可以很好运行的现有脚本,但是我的清单越来越大,我需要限制实际使用的线程数量,因为我正要杀死服务器……所以想要向此脚本添加Pool(100),但是到目前为止,我尝试的所有操作都失败了,并显示了错误代码。 有人可以帮忙添加一个简单的池吗? 我一直在四处张望,很多泳池都非常复杂,我宁愿尽量简化。 请注意,由于此脚本相当大,因此删除了实际的“ def work(item)”。

import time, os, re, threading, subprocess, sys

mylist = open('list.txt', 'r')

class working (threading.Thread):
        def __init__(self, item):
                threading.Thread.__init__(self)
                self.item = item
        def run(self):
                work(self.item)

def work(item):
        <actual work that needs to be threaded>

threads = []
for l in mylist:
        work1 = l.strip()
        thread = working(work1)
        threads.append(thread)
        thread.start()
for t in threads: t.join()
mylist.close()

添加池时出现错误:

Process PoolWorker-10:
Traceback (most recent call last):
  File "/usr/lib64/python2.6/multiprocessing/process.py", line 232, in _bootstrap
    self.run()
  File "/usr/lib64/python2.6/multiprocessing/process.py", line 88, in run
    self._target(*self._args, **self._kwargs)
  File "/usr/lib64/python2.6/multiprocessing/pool.py", line 71, in worker
    put((job, i, result))
  File "/usr/lib64/python2.6/multiprocessing/queues.py", line 366, in put
    return send(obj)
UnpickleableError: Cannot pickle <type 'thread.lock'> objects

刚刚清除的新代码:

import time, os, re, threading, subprocess, sys
from multiprocessing.dummy import Pool as ThreadPool 

mylist = open('list.txt', 'r')

class working (threading.Thread):
        def __init__(self, item):
                threading.Thread.__init__(self)
                self.item = item
        def run(self):
                work(self.item)

def work(item):
        <actual work that needs to be threaded>

threads = []
for l in mylist:
        work1 = l.strip()
        pool = ThreadPool(10)
        pool.map(working, work1)
        pool.close()

#1楼 票数:1

多处理是基于进程的高级并行包。 要使用进程,您需要能够在进程之间发送数据,这就是错误消息告诉您的某些数据是不可能的(可挑剔=可转让)。 但是,如果您在以下位置阅读模块文档:

https://docs.python.org/2/library/multiprocessing.html#module-multiprocessing.dummy

您会发现提到了一个名为multiprocess.dummy的东西。 导入它,您将使用相同的接口,但使用线程而不是进程。 那正是你想要的。

编辑

花时间阅读多处理模块的规范。 您正在做的是将单个线程对象的创建提交到池中。 您要提交的工作是要完成工作,以及要执行的项目 (在概念上)正确的解决方案如下所示:

def work(item):
    item = item.strip()
    <actual work that needs to be threaded>

pool = ThreadPool(10)
results = pool.map(work, mylist)
pool.close() # don't think this is strictly necessary

您无需将线程提交到池中,而是将工作交给池中包含的线程 这是更高层次的抽象。 希望这可以清除一切。

  ask by Aladine translate from so

未解决问题?本站智能推荐:

2回复

Python-多处理池类:线程函数可以包含参数吗?

我想知道是否可以将参数传递给线程池函数? 这是我想做的一个简单示例。如何给text1作为threadFunc函数的第二个参数? 解决了: 我用一个简单的全局可访问变量解决了这个问题...但这只是我现在遇到的问题的解决方案...使用multiprocessing.Process代替是一
1回复

python线程池复制参数

我正在学习多线程,并且尝试实现一些了解它的方法。 阅读了几个(非常技术性的主题)之后,我找不到解决问题的方法或方法。 基本上,我具有以下结构: 我认为.map函数会复制我的对象,因为它不会更新时间。 这样对吗 ? 如果是,如何输入对象的全局版本。 如果不是,您是否知道为什么时间固
1回复

python线程池问题(等待某事)

我用线程池编写了简单的网站浏览器。 问题是:然后搜寻器必须遍历所有站点,但实际上它最终需要等待某些时间,而脚本没有完成,为什么会发生这种情况?
1回复

将队列传递给线程池-Python

使用带有列表和队列的池感到困惑。 我收到错误:TypeError:在传递q.get代替列表时,“ int”对象不可迭代。 希望这只是一个疏忽。
2回复

批评此python代码(带有线程池的爬网程序)

这个python代码有多好? 需要批评)此代码中有错误,有时脚本确实打印“ ALL WAIT-CAN FINISH!”(全部等待-可以完成!)。 和冻结(没有更多的动作发生了..),但我找不到发生这种情况的原因? 带有线程池的站点搜寻器: 感谢您的帮助! 我提出了新的实现:您可以对
1回复

在这种情况下,如何在python中使用线程池

假设我要在文件的每一行中处理彼此之间不依赖的字符串。 我通常的做法: def process_line(filelines, i): #process linesimport threadingthreads = []lines = open(file).readlines()for i
1回复

多?多线程?池?队列?暴力强迫

这是一个常识性问题,很快就会变成一个项目。 我有一个脚本试图用已知的盐强制sha1强制sha1。 无论如何,在本申请中,盐是已知的。 无论如何,脚本工作正常,它是一个python脚本。 当我运行它时,它最多可以获得16个核心。 我想利用所有16​​个内核进行蛮力攻击! 我用脚本搞砸了
1回复

Python,多线程太慢,多进程

我是多处理新手, 我对线程有所了解,但我需要提高此计算的速度,希望使用多处理: 示例说明:将字符串发送到线程,更改字符串+基准测试,将结果发送回打印。 目前大约需要6秒钟,我需要它加快速度。 我一直在研究多处理,找不到与上述代码等效的东西。 我认为我的追求是集中精力,但是我