- 主题:Go语言看着要完啊
估计只能丢到线程池里面去处理了。。
同样的还有 open(), fsync() 和 close() 也没有异步版本。我也不知道各种语言是怎么处理的。
【 在 stub 的大作中提到: 】
: Linux上磁盘io,协程怎么处理,既没有异步io也没办法注册到epoll,除非是支持io_uring的版本
--
修改:hgoldfish FROM 183.253.146.*
FROM 183.253.146.*
我这个 PHPer 总是觉得 python 别扭
【 在 hgoldfish 的大作中提到: 】
: go 语言成不了 python 的全面加强版。不然 AI 用的就是 go 而不是 python 的。
: python 的语法更加灵活,随时可以使用反射,可以动态修改类。用运行效率换来语言的方便性。
: 不过仅在网络编程语言,golang 确实能够大部分取代 python 了。python 社区唯一的问题是没有在 py2.7 -> py3k 大版本升级的时候,把 gevent 直接集成到 python 虚拟机。这个时间丢失了,后面 python 在网络编程领域就节节败退了。
: ...................
--
FROM 112.66.23.*
协程还引发一个协程安全问题, 原子化问题。写单线程的旧代码怎么也没想到中间的变量居然会被其他人改
【 在 leadu 的大作中提到: 】
: 1.ui线程问题。比如有一个后台协程,在需要更新界面内容的情况下,如何回到ui线程?非ui线程直接操作ui会失败的。
: 2.协程敏感的api范围问题。io操作的范围非常广,并口串口usb蓝牙等等。就算是大类网络和文件,也有查询dns和查看文件信息这种,可以异步但大家一般用的都是同步版本的api.协程敏感的api设计对这些如何处理的?
: 3.性能问题。你不是正经的c++程序员出身的,所以很多c++或是传统程序员的习惯你不太清楚。
: ...................
--
FROM 112.66.23.*
chatgpt回答
在Linux上进行磁盘IO时,可以使用协程来处理。协程是一种用户态线程,可以在同一个线程中实现多个并发任务的执行。协程可以通过将任务划分为多个子任务来实现异步执行,从而避免了阻塞等待。
在没有支持IO_URING的版本中,可以使用协程库,如libco或者boost.coroutine来实现协程。这些库会在协程中使用非阻塞IO,从而避免了阻塞等待。
具体实现方式可以参考下面的伪代码:
```c++
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <linux/fs.h>
#include <boost/coroutine2/all.hpp>
using namespace boost::coroutines2;
void disk_io(coroutine<void>::push_type& sink, int fd, void* buf, size_t len, off_t offset)
{
int ret = pwrite(fd, buf, len, offset);
if (ret < 0) {
if (errno == EAGAIN || errno == EWOULDBLOCK) {
// 如果是非阻塞IO,则将协程yield,等待IO完成后再恢复协程执行
sink();
ret = pwrite(fd, buf, len, offset);
}
if (ret < 0) {
printf("write error: %s\n", strerror(errno));
return;
}
}
printf("write %d bytes to disk\n", ret);
}
int main()
{
int fd = open("test.txt", O_WRONLY|O_CREAT, 0666);
if (fd < 0) {
printf("open error: %s\n", strerror(errno));
return -1;
}
char buf[1024] = {0};
off_t offset = 0;
coroutine<void>::pull_type io_coroutine([&](coroutine<void>::push_type& sink) {
disk_io(sink, fd, buf, sizeof(buf), offset);
});
while (io_coroutine) {
io_coroutine();
}
close(fd);
return 0;
}
```
在上述代码中,disk_io函数用于实现非阻塞的磁盘IO操作,如果遇到非阻塞IO,则将协程yield,等待IO完成后再恢复协程执行。main函数中使用协程库创建协程,并在循环中执行协程,直到协程执行完毕。
需要注意的是,上述代码仅为演示如何使用协程实现非阻塞IO,实际使用中需要根据具体情况进行修改和优化。同时,如果需要更高效的IO操作,建议使用支持IO_URING的版本。
【 在 stub 的大作中提到: 】
: Linux上磁盘io,协程怎么处理,既没有异步io也没办法注册到epoll,除非是支持io_uring的版本
--
FROM 114.249.16.*
【 在 gfkid 的大作中提到: 】
: chatgpt回答
: 在Linux上进行磁盘IO时,可以使用协程来处理。协程是一种用户态线程,可以在同一个线程中实现多个并发任务的执行。协程可以通过将任务划分为多个子任务来实现异步执行,从而避免了阻塞等待。
: 在没有支持IO_URING的版本中,可以使用协程库,如libco或者boost.coroutine来实现协程。这些库会在协程中使用非阻塞IO,从而避免了阻塞等待。
: ...................
核心在于不知道io什么时候完成
--
FROM 223.160.130.*
不知道就阻塞呗,还能怎么样
都用了这种操作系统了,说明无所谓效率吧
【 在 stub 的大作中提到: 】
: 核心在于不知道io什么时候完成
--
FROM 8.219.71.*
c++ 这种上古语言难用的要死
配个开发环境安装依赖库就要搞半天
更不要说运行环境, 库版本不一致的问题了
【 在 leadu 的大作中提到: 】
: 做成啥了,就一个编排,docker听说还在把go换成c的?
: 老鱼你别看见我就条件反射以为我要说c#,哈哈,我这个帖子到现在一直没有提c#
: 严格的来说,我今天是帮c++找go的场子来了
: ...................
--
FROM 35.236.148.*
协程并不代表着没有互斥啊。
一般说来加锁有两个作用:内存屏障和互斥。
单线程的协程环境,比如 python 和 nodejs 可以免费获得前者,因为协程那么多,其实都跑同一个线程,不需要内存屏障。
后者需要自行处理。所以 go 语言搞出 chan 是有道理的。
【 在 chaobill 的大作中提到: 】
: 协程还引发一个协程安全问题, 原子化问题。写单线程的旧代码怎么也没想到中间的变量居然会被其他人改
--
FROM 47.243.39.*
有中断
【 在 stub 的大作中提到: 】
: 核心在于不知道io什么时候完成
--
FROM 98.45.244.*