Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法在一个不自信的线程上运行cpython而不冒崩溃的风险?_Python_Windows_Urllib_Cpython_Python Multithreading - Fatal编程技术网

有没有办法在一个不自信的线程上运行cpython而不冒崩溃的风险?

有没有办法在一个不自信的线程上运行cpython而不冒崩溃的风险?,python,windows,urllib,cpython,python-multithreading,Python,Windows,Urllib,Cpython,Python Multithreading,我有一个在无限循环中运行大量urllib请求的程序,这使得我的程序非常慢,所以我尝试将它们作为线程。Urllib在socket模块的深层使用cpython,因此正在创建的线程只是相加,什么也不做,因为python的GIL阻止在不同的线程中同时执行两个cpython命令。我正在使用Python2.5运行Windows XP,因此无法使用多进程模块。我试着查看subaccess模块,看看是否有办法在子流程中以某种方式执行python代码,但什么都没有。如果有人有办法让我通过多进程中的函数创建pyth

我有一个在无限循环中运行大量urllib请求的程序,这使得我的程序非常慢,所以我尝试将它们作为线程。Urllib在socket模块的深层使用cpython,因此正在创建的线程只是相加,什么也不做,因为python的GIL阻止在不同的线程中同时执行两个cpython命令。我正在使用Python2.5运行Windows XP,因此无法使用多进程模块。我试着查看subaccess模块,看看是否有办法在子流程中以某种方式执行python代码,但什么都没有。如果有人有办法让我通过多进程中的函数创建python子进程,那就太好了

此外,我宁愿不下载外部模块,但我愿意

编辑:这是我当前程序中的一些代码示例

    url = "http://example.com/upload_image.php?username=Test&password=test"
    url = urllib.urlopen(url, data=urllib.urlencode({"Image": raw_image_data})).read()
    if url.strip().replace("\n", "") != "":
        print url

我做了一个测试,结果表明urllib2的urlopen有请求对象和没有请求对象仍然一样慢或更慢。我创建了自己的自定义timeit-like模块,上面的模块大约需要0.5-2秒,这对于我的程序来说非常糟糕。

如果您想要多线程,Jython可能是一个选项,因为它没有GIL

我同意简·菲利普和皮奥特的观点。你用urllib做什么

Urllib在套接字模块的深处使用cpython,因此线程 由于python的GIL 防止在diffident中执行两个cpython命令 线程同时运行

错。虽然这是一个常见的误解。CPython可以并且确实为IO操作释放GIL(查看中的所有
Py\u BEGIN\u ALLOW\u THREADS
)。当一个线程等待IO完成时,其他线程可以做一些工作。如果
urllib
调用是脚本中的瓶颈,那么线程可能是可接受的解决方案之一

我正在使用Python2.5运行Windows XP,因此无法使用多进程模块

您可以安装Python2.6或更新版本,或者如果必须使用Python2.5;您可以单独安装

我创建了自己的自定义timeit-like模块,上面的过程大约需要0.5-2秒,这对于我的程序来说非常糟糕

urllib2.urlopen的性能http://example.com...).read()
主要取决于外部因素,如DNS、网络延迟/带宽、example.com服务器本身的性能

下面是一个使用
线程
urllib2
的示例脚本:

import urllib2
from Queue import Queue
from threading import Thread

def check(queue):
    """Check /n url."""
    opener = urllib2.build_opener() # if you use install_opener in other threads
    for n in iter(queue.get, None):
        try:
            data = opener.open('http://localhost:8888/%d' % (n,)).read()
        except IOError, e:
            print("error /%d reason %s" % (n, e))
        else:
            "check data here"

def main():
    nurls, nthreads = 10000, 10

    # spawn threads
    queue = Queue()
    threads = [Thread(target=check, args=(queue,)) for _ in xrange(nthreads)]
    for t in threads:
        t.daemon = True # die if program exits
        t.start()

    # provide some work
    for n in xrange(nurls): queue.put_nowait(n)
    # signal the end
    for _ in threads: queue.put(None)
    # wait for completion
    for t in threads: t.join()

if __name__=="__main__":
   main()
要将其转换为多处理脚本,只需使用不同的导入,您的程序将使用多个进程:

from multiprocessing import Queue
from multiprocessing import Process as Thread

# the rest of the script is the same

你的整个程序都是用CPython写的吗?你介意更详细地回答你的问题吗?你想实现什么,你做什么,问题在哪里?Guido拒绝了删除GIL的想法,因为这会对实现造成太大的改变,所以我认为你无法“删除GIL”。这需要完全重写大多数CPython代码。一个简单的解决方案是使用进程而不是线程。为请求启动4-5个进程,将结果保存到文件中,然后使用“主进程”中的文件。我喜欢diffident线程的想法。可能是一个胆小或害羞的线程,它确实有足够的信心执行代码。使用非阻塞IO而不是线程。这里有很多答案可以解释为什么在您的场景中非阻塞IO比线程更好。你可以从开始。我的程序有一个无限循环,它一直持续到程序被“控制”或以其他方式转义。我尝试了这个方法,并且它只在线程被后置连接时才工作,但这同样糟糕,因为它等待线程,对吗?@user1474837:no.
queue.put(None)
发出线程应该退出的信号。程序退出,然后处理所有项目。