Comments (5)
Wow, that's some wonderful investigation you've done.
Yes, it I can reproduce the behavior on Linux if I switch the code to the subprocess behavior used on MacOS.
I'm no expert in the low level OS details either, but should I guess (based on some investigations), the difference seems to be that the >
version is a command output redirection while the piped (|
) version seem to wait for the whole process (and subprocesses) to finish. The Popen.communicate()
waits for the subprocess to finish (as written here).
Come to think of it, I really don't know why the process.communicate()
command is used there - it does not seem to pass any value to the subprocess, does not do anything with the possible result returned from the subprocess. And there seems to be no info in the method docs that you have to wait for the subprocess to finish or join it back or anything.
The only thing I can see it does is wait for the subprocess to finish (which seems to be against the purpose of daemonizing the update fetcher).
But feel free to correct me if I am wrong - @isidentical and @jkbrzt (authors of the commit).
Unless you see a use for it, I would suggest just to remove the process.communicate()
call, that should fix the problem.
from cli.
I have tried to reproduce your result but so far without meaningful success. Nothing on the scale presented by your result. My results seem to vary by server response time.
⬢[lukas@toolbox ~]$ time http https://restcountries.com/v3.1/alpha/cz?fields=currencies,capital > /dev/null
real 0m0.617s
user 0m0.259s
sys 0m0.050s
⬢[lukas@toolbox ~]$ time http https://restcountries.com/v3.1/alpha/cz?fields=currencies,capital | cat > /dev/null
real 0m0.641s
user 0m0.279s
sys 0m0.056s
⬢[lukas@toolbox ~]$ time http https://restcountries.com/v3.1/alpha/cz > /dev/null
real 0m0.683s
user 0m0.279s
sys 0m0.043s
⬢[lukas@toolbox ~]$ time http https://restcountries.com/v3.1/alpha/cz | cat > /dev/null
real 0m0.626s
user 0m0.271s
sys 0m0.047s
I have tried with fully up to date Fedora Workstation 38, httpie 3.2.2-2, time 1.9-20, both from Fedora repositories.
Could you please double-check that the issue still exists and provide some more details to your setup, like your OS (and version), httpie version and more details what your server response looks like (valid json?, response length? etc).
from cli.
Thanks for looking into it. I tested it again against an httpbin server running on localhost and hitting http://localhost:8000/get
with httpie
3.2.2:
- On MacOS Ventura 13.2.1 (
Darwin Kernel Version 22.3.0
) the piped version is ~4-5x slower - On Linux (
#35~20.04.1-Ubuntu SMP
) there is not significant difference.
So it manifests on macOS only; I'll edit the title.
from cli.
Thanks for taking the time to double-check. Unfortunately, not having an access to Mac I won't be able to test and look into it further.
On the other hand, at the very least, you've managed to narrow the problem down a bit and save the next person looking some time figuring out where the problem is 😄
from cli.
After several hours of debugging, it turns out this is unrelated to potential buffering differences between MacOS and Linux as I had original suspected; it's this code. Commenting it out (or just the process.communicate()
line) does away with the lag.
That's as far as I got. I don't have an explanation of why this affects only the piped version; the interactive non-piped version also calls process.communicate()
but it apparently finishes(?) much faster. And I don't know enough about the low-level OS-specific process spawn details in this module.
I have to say, I am kind of shocked to find out that an HTTP client CLI includes a "feature" that:
- will regularly warn you about the new update by checking the latest version on PyPI.
- is enabled by default and if you want to disable it you have to add/edit a config file, can't do it from the CLI.
- requires an ad-hoc (and unsurprisingly buggy) daemons module instead of delegating to a library designed specifically for this.
IMO the whole httpie.internal
subpackage needs to go or at least be extracted as a separate project. Checking for new releases has nothing to do with sending requests to HTTP servers.
from cli.
Related Issues (20)
- Average speed is reported incorrectly for resumed downloads HOT 1
- How to remove DEFAULT_UA? HOT 2
- Default to localhost HOT 2
- Allow XDG_CONFIG_HOME usage also on Windows
- More statuses support HOT 1
- Unable to install httpie via Chocolatey HOT 14
- Display a warning for using option --ignore-stdin when request fails with content present in stdin
- Request is fired to packages.httpie.io on every invocation of `http` HOT 11
- How to post an empty string as a data field? HOT 2
- werkzeug compatibility
- Docs: Ubuntu/Debian installation script gives error
- Does not work with a small easy peasy sample 'http -f requests.http' HOT 4
- Add shortcut to --verify=no
- Default headers by domain
- Add support for OAuth2 authentication
- Can't install a plugin because cannot invoke pip
- HTTPS_PROXY not working HOT 1
- Hash character `#` in a query string causes the rest of the string to be ignored HOT 2
- Trim trailing empty lines from CLI output HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from cli.